Shell教程(流控制、函式)(第三天)
阿新 • • 發佈:2018-11-14
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}。當n>=10時,需要使用${n}來獲取引數。
另外,還有幾個特殊字元用來處理引數: