shell編程(三)之函數
阿新 • • 發佈:2019-04-25
true 。。 enter 提示 腳本 失敗 啟動 stopped 語法 考慮: 如果事先已經啟動過一次,該如何處理
4.如果是stop,則刪除/var/lock/subsys/SCRIPT_NAME,並顯示停止完成
考慮: 如果事先已然停止過了,該如何處理
5 如果是restart,則先stop,在start
考慮:如果本來沒有start,如何處理
6.如果是status,則:
如果/var/lock/subsys/SCRIPT_NAME文件存在,則顯示”SCRIPT_NAME is running“
如果/var/lock/subsys/SCRIPT_NAME文件不存在,則顯示”SCRIPT_NAME is stopped“
function:函數
函數只有被調用才會執行
如何調用:給定函數名
函數名出現的地方,會被自動替換為函數代碼
函數的生命周期:被調用時創建,返回時終止
return命令返回自定義狀態結果
0:成功
1-255:失敗
語法一:
function f_name { ...函數體... }
語法二:
f_name(){
...函數體...
}
練習: 寫一個腳本,完成如下要求
1.腳本可接受參數:start,stop,restart,status
2.如果參數非此四者之一,提示使用格式後報錯退出
3.如果是start,則創建/var/lock/subsys/SCRIPT_NAME,並顯示啟動成功
4.如果是stop,則刪除/var/lock/subsys/SCRIPT_NAME,並顯示停止完成
考慮: 如果事先已然停止過了,該如何處理
5 如果是restart,則先stop,在start
考慮:如果本來沒有start,如何處理
6.如果是status,則:
如果/var/lock/subsys/SCRIPT_NAME文件存在,則顯示”SCRIPT_NAME is running“
如果/var/lock/subsys/SCRIPT_NAME文件不存在,則顯示”SCRIPT_NAME is stopped“
#!/bin/bash proc=$(basename $0) file=/var/lock/subsys/$proc function start { if [ -e $file ]; then echo "$proc服務已啟動。。。" else touch $file if [ $? -eq 0 ]; then echo "$proc服務啟動成功" else echo "$proc服務啟動失敗" fi fi } function stop { if [ -e $file ]; then rm -rf $fileif [ $? -eq 0 ]; then echo "$proc服務停止成功" else echo "$proc服務停止失敗" fi else echo "$proc服務已停止" fi }
function restart { if [ -e $file ]; then stop start else start fi }
function status { if [ -e $file ]; then echo "$proc is running" else echo "$proc is stopped" fi }
while true; do case $option in start) start ;; stop) stop ;; restart) restart ;; status) status ;; esac read -p "Enter an option(start or stop or restart or status):" option if [[ $option != "start" && $option != "stop" && $option != "status" && $option != "restart" ]]; then read -p "wrong option,Enter an option again:" option fi done
test18.sh 腳本加入服務:
cp test18.sh /etc/rc.d/init.d chkconfig --add test18.sh chkconfig --list test18.sh chkconfig --level 2345 testsrv on
練習: 添加10個用戶
#!/bin/bash # 添加是個用戶,函數實現 function adduser { if [ $# -lt 1 ]; then return 2 # 2: no arguments fi if id $1 &> /dev/null; then echo "$1 exists." return 1 else useradd $1 [ $? -eq 0 ] && echo "add $1 success" && return 0 fi } for i in $(seq 1 1 10);do adduser myuser$i done
函數遞歸:函數直接或間接調用自身
1.階乘:
#!/bin/bash fact() { if [ $1 -eq 0 -o $1 -eq 1 ]; then echo 1 else echo $[$1*$(fact $[$1-1])] fi } fact 5
2.斐波那契
#!/bin/bash fab (){ if [ $1 -eq 1 -o $1 -eq 2 ]; then echo 1 else echo $[$(fab $[$1-1])+$(fab $[$1-2])] fi } fab 10
shell編程(三)之函數