1. 程式人生 > >shell編程(三)之函數

shell編程(三)之函數

true 。。 enter 提示 腳本 失敗 啟動 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 $file
    if [ $? -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編程(三)之函數