1. 程式人生 > >Shell程式設計入門三:流程控制

Shell程式設計入門三:流程控制

和Java、PHP等語言不一樣,sh的流程控制不可為空,如:

public class Test{
    public static void main(String[] args){
        int a = 10;
        if(a > 5){
            System.out.println("a 大於 5");
        }
        else{
            //不做任何事
        }
    }
}

在bash裡不能這麼寫,如果 else 分支沒有語句執行,就不要寫這個 else

if

語句語法格式如下:

a=10
b=20
if [ $a == $b ]
then
    echo "a is same to b."
fi

if else

語句語法格式如下:

a=10
b=20
if [ $a == $b ]
then
    echo "a is same to b."
else
    echo "a is not same to b."
fi

if else-if else

語句語法格式如下:

a=10
b=20
if [ $a == $b ]
then
   echo "a 等於 b"
elif [ $a -gt $b ]
then
   echo "a 大於 b"
elif
[ $a -lt $b ] then echo "a 小於 b" else echo "沒有符合的條件" fi

輸出結果為:a 小於 b

if else語句經常與test命令結合使用,如下所示:

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '兩個數字相等!'
else
    echo '兩個數字不相等!'
fi

輸出結果為:兩個數字不相等

for 迴圈

順序輸出當前列表中的數字:

for loop in 1 2 3 4 5
do
    echo "The value is : $loop
"
done

while 語句

num=1
while(( $num<=5 ))
do
    echo $num
    let "num++"
done

在bash中使用了 let 命令,它用於執行一個或多個表示式。變數計算中不需要加上 $ 變數。

while 迴圈可用於讀取鍵盤資訊。以下例子,輸入資訊被設定為變數 input ,按 Ctrl + D 結束迴圈。

echo "按下 ctrl + D 退出"
echo "請輸入資訊:"
while read input
do
    echo "your input is : $input"
done

until 迴圈

until 迴圈執行一系列命令直至條件為真時停止。
until 迴圈與 while 迴圈在處理方式上剛好相反。

num=5
until(( $num>10 ))
do
    echo $num
    let "num++"
done

結果將依次輸出:5 6 7 8 9 10

case

可以用 case 語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。

echo '請輸入資訊'
read aNum
case $aNum in
    1)  echo '你選擇了 1'
    ;;
    2)  echo '你選擇了 2'
    ;;
    3)  echo '你選擇了 3'
    ;;
    "wsz")  echo '你選擇了 wsz'
    ;;
    *)  echo '你沒有輸入 1 到 4 之間的數字'
    ;;
esac
  • case 工作方式如上所示。取值後面必須為單詞 in ,每一模式必須以右括號結束。取值可以為變數或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;; 表示 break
  • 取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令後不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行後面的命令。
  • esac 語法和C family語言差別很大,它需要一個 esac(就是case反過來)作為結束標記,每個 case 分支用) ,用 ;; 表示 break

跳出迴圈

break

下面的例子中,指令碼進入死迴圈直至使用者輸入數字不是 1 2 3 4 5 中的一個。要跳出這個迴圈,需要使用break命令。

while :
do
    read aNum
    case $aNum in
    1|2|3|4|5) echo "your input is $aNum"
    ;;
    *) echo "game over"
        break
    ;;
    esac
done

continue

continue 命令與 break 命令類似,只有一點差別,它不會跳出所有迴圈,僅僅跳出當前迴圈。

for (( i=0 ; i<10 ; i++ ))
do
    if [ $i == 3 ]
    then
        continue
    else
        echo $i
    fi
done

上述結果將輸出:0 1 2 4 5 6 7 8 9,不會輸出 3


參考自:http://www.runoob.com/linux/linux-shell-process-control.html