1. 程式人生 > >Shell教程(流控制、函式)(第三天)

Shell教程(流控制、函式)(第三天)

if else

句式:

if condition
then
    command1 
    command2
    ...
    commandN 
fi
  • if else if else
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
  • if else語句經常與test命令結合使用,如下所示:
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '兩個數字相等!'
else
    echo '兩個數字不相等!'
fi

結果:
兩個數字相等!

for迴圈:

句式:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
for str in 'This is a string'
do
    echo $str
done

結果:

This is a string

while 語句

句式:

while condition
do
    command
done
#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

輸出:

1
2
3
4
5
  • 無限迴圈

無限迴圈語法格式:

while :
do
    command
done

或者

while true
do
    command
done

或者

for (( ; ; ))


until 迴圈

  • until 迴圈執行一系列命令直至條件為 true 時停止。
  • until 迴圈與 while 迴圈在處理方式上剛好相反。
    一般 while 迴圈優於 until 迴圈,但在某些時候—也只是極少數情況下,until 迴圈更加有用。
    until 語法格式:
    until condition
    do
    command
    done
  • condition 一般為條件表示式,如果返回值為 false,則繼續執行迴圈體內的語句,否則跳出迴圈。
    以下例項我們使用 until 命令來輸出 0 ~ 9 的數字:
#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

執行結果:
輸出結果為:
0
1
2
3
4
5
6
7
8
9

case

Shell case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。case語句格式如下:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
  • case工作方式如上所示。取值後面必須為單詞in,每一模式必須以右括號結束。取值可以為變數或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;;。
  • 取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令後不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行後面的命令。
  • 下面的指令碼提示輸入1到4,與每一種模式進行匹配:
echo '輸入 1 到 4 之間的數字:'
echo '你輸入的數字為:'
read aNum
case $aNum in
    1)  echo '你選擇了 1'
    ;;
    2)  echo '你選擇了 2'
    ;;
    3)  echo '你選擇了 3'
    ;;
    4)  echo '你選擇了 4'
    ;;
    *)  echo '你沒有輸入 1 到 4 之間的數字'
    ;;
esac

結果:

輸入 1 到 4 之間的數字:
你輸入的數字為:
3
你選擇了 3

跳出迴圈

  • 在迴圈過程中,有時候需要在未達到迴圈結束條件時強制跳出迴圈,Shell使用兩個命令來實現該功能:break和continue。
  • break命令
  • break命令允許跳出所有迴圈(終止執行後面的所有迴圈)。
  • 下面的例子中,指令碼進入死迴圈直至使用者輸入數字大於5。要跳出這個迴圈,返回到shell提示符下,需要使用break命令。
    #!/bin/bash
    while :
    do
    echo -n “輸入 1 到 5 之間的數字:”
    read aNum
    case $aNum in
    1|2|3|4|5) echo “你輸入的數字為 $aNum!”
    ;;
    *) echo “你輸入的數字不是 1 到 5 之間的! 遊戲結束”
    break
    ;;
    esac
    done
    執行以上程式碼,輸出結果為:
    輸入 1 到 5 之間的數字:3
    你輸入的數字為 3!
    輸入 1 到 5 之間的數字:7
    你輸入的數字不是 1 到 5 之間的! 遊戲結束
  • continue
  • continue命令與break命令類似,只有一點差別,它不會跳出所有迴圈,僅僅跳出當前迴圈。
  • 對上面的例子進行修改:
    #!/bin/bash
    while :
    do
    echo -n "輸入 1 到 5 之間的數字: "
    read aNum
    case $aNum in
    1|2|3|4|5) echo “你輸入的數字為 $aNum!”
    ;;
    *) echo “你輸入的數字不是 1 到 5 之間的!”
    continue
    echo “遊戲結束”
    ;;
    esac
    done
  • 執行程式碼發現,當輸入大於5的數字時,該例中的迴圈不會結束,語句 echo “遊戲結束” 永遠不會被執行。

Shell 函式

格式:

[ function ] funname [()]

{

    action;

    [return int;]

}

說明:

  • 1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何引數
  • 2、引數返回,可以顯示加:return 返回,如果不加,將以最後一條命令執行結果,作為返回值。 return後跟數值n(0-255

例子:

#!/bin/bash


funWithReturn(){
    echo "這個函式會對輸入的兩個數字進行相加運算..."
    echo "輸入第一個數字: "
    read aNum
    echo "輸入第二個數字: "
    read anotherNum
    echo "兩個數字分別為 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個數字之和為 $? !"

結果:

這個函式會對輸入的兩個數字進行相加運算...
輸入第一個數字: 
1
輸入第二個數字: 
2
兩個數字分別為 1 和 2 !
輸入的兩個數字之和為 3 !
  • 函式返回值在呼叫該函式後通過 $? 來獲得。
  • 注意:所有函式在使用前必須定義。這意味著必須將函式放在指令碼開始部分,直至shell直譯器首次發現它時,才可以使用。呼叫函式僅使用其函式名即可。

函式引數

  • 在Shell中,呼叫函式時可以向其傳遞引數。在函式體內部,通過 $n 的形式來獲取引數的值,例如,$1表示第一個引數,$2表示第二個引數…
    帶引數的函式示例:
#!/bin/bash

funWithParam(){
    echo "第一個引數為 $1 !"
    echo "第二個引數為 $2 !"
    echo "第十個引數為 $10 !"
    echo "第十個引數為 ${10} !"
    echo "第十一個引數為 ${11} !"
    echo "引數總數有 $# 個!"
    echo "作為一個字串輸出所有引數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

結果:

第一個引數為 1 !
第二個引數為 2 !
第十個引數為 10 !
第十個引數為 34 !
第十一個引數為 73 !
引數總數有 11 個!
作為一個字串輸出所有引數 1 2 3 4 5 6 7 8 9 34 73 !
  • 注意, 10 10 不能獲取第十個引數,獲取第十個引數需要 {10}。當n>=10時,需要使用${n}來獲取引數。
    另外,還有幾個特殊字元用來處理引數:
    在這裡插入圖片描述