Linux Shell命令(四) 迴圈語句 函式
for迴圈
與其他程式語言類似,Shell支援for迴圈。
for迴圈一般格式為:
for 變數 in 列表
do
command1
command2
...
commandN
done
列表是一組值(數字、字串等)組成的序列,每個值通過空格分隔。每迴圈一次,就將列表中的下一個值賦給變數。
in 列表是可選的,如果不用它,for 迴圈使用命令列的位置引數。
範例1
順序輸出當前列表中的數字:
#!/bin/bash
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
執行結果:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
範例2
順序輸出字串中的字元:
#!/bin/bash
for str in This is a string
do
echo $str
done
執行結果:
This is a string
while迴圈
while迴圈用於不斷執行一系列命令,也用於從輸入檔案中讀取資料;命令通常為測試條件。其格式為:
while command
do
Statement(s) to be executed if command is true
done
命令執行完畢,控制返回迴圈頂部,從頭開始直至測試條件為假。
範例1
以下是一個基本的while迴圈,測試條件是:如果COUNTER小於5,那麼返回 true。COUNTER從0開始,每次迴圈處理時,COUNTER加1。執行上述指令碼,返回數字1到5,然後終止。
#!/bin/bash COUNTER=0 while [ $COUNTER -lt 5 ] do COUNTER=`expr $COUNTER + 1` echo $COUNTER done
執行指令碼,輸出:
1
2
3
4
5
範例2
while迴圈可用於讀取鍵盤資訊。下面的例子中,輸入資訊被設定為變數FILM,按結束迴圈。
#!/bin/bash
echo 'type <CTRL-D> to terminate'
echo -n 'enter your most liked film: '
while read FILM
do
echo "Yeah! great film the $FILM"
done
執行指令碼,輸出類似下面:
type <CTRL-D> to terminate
enter your most liked film: Sound of Music
Yeah! great film the Sound of Music
until迴圈
until迴圈執行一系列命令直至條件為true時停止。until迴圈與while迴圈在處理方式上剛好相反。一般while迴圈優於until迴圈,但在某些時候,也只是極少數情況下,until迴圈更加有用。
until迴圈格式為:
until command
do
Statement(s) to be executed until command is true
done
command一般為條件表示式,如果返回值為false,則繼續執行迴圈體內的語句,否則跳出迴圈。
範例1
使用 until 命令輸出 0 ~ 4 的數字:
#!/bin/bash
a=0
until [ ! $a -lt 5 ]
do
echo $a
a=`expr $a + 1`
done
執行結果:
0
1
2
3
4
用break跳出迴圈
在迴圈過程中,有時候需要在未達到迴圈結束條件時強制跳出迴圈,像大多數程式語言一樣,Shell也使用break來跳出迴圈。
break命令允許跳出所有迴圈(終止執行後面的所有迴圈)。
範例1
下面的例子中,指令碼進入死迴圈直至使用者輸入數字大於5。要跳出這個迴圈,返回到shell提示符下,就要使用break命令。
#!/bin/bash
while :
do
echo -n "Input a number between 1 to 5: "
read aNum
case $aNum in
1|2|3|4|5) echo "Your number is $aNum!"
;;
*) echo "You do not select a number between 1 to 5, game is over!"
break
;;
esac
done
在巢狀迴圈中,break 命令後面還可以跟一個整數,表示跳出第幾層迴圈。
範例2
下面是一個巢狀迴圈的例子,如果 var1 等於 2,並且 var2 等於 0,就跳出迴圈:
#!/bin/bash
for var1 in 1 2 3
do
for var2 in 0 5
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
break 2
else
echo "$var1 $var2"
fi
done
done
如上,break 2 表示直接跳出外層迴圈。執行結果:
1 0
1 5
用continue繼續迴圈
continue命令與break命令類似,只有一點差別,它不會跳出所有迴圈,僅僅跳出當前迴圈。
範例1
對break的例子進行修改:
#!/bin/bash
while :
do
echo -n "Input a number between 1 to 5: "
read aNum
case $aNum in
1|2|3|4|5) echo "Your number is $aNum!"
;;
*) echo "You do not select a number between 1 to 5!"
continue
echo "Game is over!"
;;
esac
done
執行程式碼發現,當輸入大於5的數字時,該例中的迴圈不會結束,語句 echo "Game is over!" 永遠不會被執行。
同樣,continue 後面也可以跟一個數字,表示跳出第幾層迴圈。
定義及使用函式
函式可以讓我們將一個複雜功能劃分成若干模組,讓程式結構更加清晰,程式碼重複利用率更高。像其他程式語言一樣,Shell 也支援函式。Shell 函式必須先定義後使用。
Shell 函式的定義格式如下:
function_name () {
list of commands
[ return value ]
}
如果你願意,也可以在函式名前加上關鍵字 function:
function function_name () {
list of commands
[ return value ]
}
範例1
下面是一個函式使用的簡單例子:
#!/bin/bash
# Define your function here
Hello () {
echo "Url is http://www.hubwiz.com"
}
# Invoke your function
Hello
執行結果:
/bin/bash test_function
Url is http://www.hubwiz.com
呼叫函式只需要給出函式名,不需要加括號。
函式返回值
函式返回值,可以顯式增加return語句;如果不加,會將最後一條命令執行結果作為返回值。
函式返回值在呼叫該函式後通過 $? 來獲得。
範例1
來看一個帶有return語句的函式:
#!/bin/bash
funWithReturn(){
echo "The function is to get the sum of two numbers..."
echo -n "Input first number: "
read aNum
echo -n "Input another number: "
read anotherNum
echo "The two numbers are $aNum and $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
# Capture value returnd by last command
ret=$?
echo "The sum of two numbers is $ret !"
執行結果:
The function is to get the sum of two numbers...
Input first number: 25
Input another number: 50
The two numbers are 25 and 50 !
The sum of two numbers is 75 !
Shell 函式返回值只能是整數,一般用來表示函式執行成功與否,0表示成功,其他值表示失敗。如果 return 其他資料,比如一個字串,往往會得到錯誤提示:“numeric argument required”。
注:如果一定要讓函式返回字串,那麼可以先定義一個變數,用來接收函式的計算結果,指令碼在需要的時候訪問這個變數來獲得函式返回值。
函式引數
在Shell中,呼叫函式時可以向其傳遞引數。在函式體內部,通過 $n 的形式來獲取引數的值,例如,$1表示第一個引數,$2表示第二個引數...
範例1
帶引數的函式範例:
#!/bin/bash
funWithParam(){
echo "The value of the first parameter is $1 !"
echo "The value of the second parameter is $2 !"
echo "The value of the tenth parameter is $10 !"
echo "The value of the tenth parameter is ${10} !"
echo "The value of the eleventh parameter is ${11} !"
echo "The amount of the parameters is $# !" # 引數個數
echo "The string of the parameters is $* !" # 傳遞給函式的所有引數
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
執行指令碼:
The value of the first parameter is 1 !
The value of the second parameter is 2 !
The value of the tenth parameter is 10 !
The value of the tenth parameter is 34 !
The value of the eleventh parameter is 73 !
The amount of the parameters is 12 !
The string of the parameters is 1 2 3 4 5 6 7 8 9 34 73 !
注意,$10 不能獲取第十個引數,獲取第十個引數需要${10}。當n>=10時,需要使用${n}來獲取引數。
函式巢狀
同其他語言一樣,shell函式也支援巢狀使用。
範例1
下面來看一個函式巢狀的例子:
#!/bin/bash
# Calling one function from another
number_one () {
echo "Url_1 is http://www.baidu.com/cpp/shell/"
number_two
}
number_two () {
echo "Url_2 is http://www.baidu.com/cpp/u/xitong/"
}
number_one
執行結果:
Url_1 is http://www.baidu.com/cpp/shell/
Url_2 is http://www.baidu.com/cpp/u/xitong/
主要內容來自學習平臺: 匯智網,筆者在centos7上進行了一些擴充套件和補充。