1. 程式人生 > >Linux Shell命令(四) 迴圈語句 函式

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上進行了一些擴充套件和補充。