『忘了再學』Shell流程控制 — 39、特殊流程控制語句

繁華似錦Fighting 發表於 2022-06-23

1、特殊流程控制語句介紹

Shell程式或者說其他的程式,都是順序執行的,也就是第一行執行完再執行第二行,以此類推,依次執行。

而流程控制語句,如:

  • if條件判斷語句,你只有條件成立了,才能夠執行,否則就不執行其中的程式,這就會跳過一些執行命令。
  • for迴圈也是流程控制類語句,是重複執行指定次數的相同程式碼。

除了上面的條件判斷語句和迴圈語句外,還有特殊流程控制語句。

比如:exit語句、break語句、continue語句。

2、exit語句

系統有一個exit命令,用於退出當前使用者的登入狀態。

可是在Shell指令碼中,exit語句是用來退出當前指令碼的。也就是說,在Shell指令碼中,只要碰到了exit語句,後續的程式就不再執行,而直接退出指令碼。

exit的語法如下:

exit [返回值]
  • 如果exit語句之後定義了返回值,那麼這個指令碼執行之後的返回值就是我們自己定義的返回值。可以通過查詢$?這個變數,來檢視返回值。
  • 如果exit語句之後沒有定義返回值,指令碼執行之後的返回值是,執行exit語句之前,最後執行的一條命令的返回值。

寫一個exit的例子:
需求:判斷輸入是否為純數字。

#!/bin/bash
# 演示exit的作用

# 接收使用者的輸入,並把輸入賦予變數num
read -p "Please input a number:" -t 30 num

# 如果變數num的值是數字,則把num的值替換為空,否則不替換
# 把替換之後的值賦予變數y
y=$(echo $num | sed 's/[0-9]//g' )


    # 說明:
    # 就是通過sed命令,把變數num值中的每一個字元,只要是0-9的內容,就替換為空。
    # 最後如果y的值最後為空,證明num變數中的內容全部為數字,因為全部被替換了。
    # 如果y的值最後不為空,證明num變數中的內容有非數字,即num非純數字。


# 判斷變數y的值如果不為空,輸出報錯資訊,
# 退出指令碼,退出返回值為18
if [ -n "$y" ]
    then
        echo "Error!Please input a number!"
        exit 18
        # 說明:
        # 如果輸入的不是數字,上面這兩句指令碼命令會執行,
        # exit語句一旦執行指令碼就會終止。
else
    # 如果沒有退出指令碼,則列印變數num中的數字
    echo "The number is:$num"

執行該指令碼

# 給Shell指令碼賦予執行許可權
[[email protected] sh]# chmod 755 exit.sh
# 執行指令碼
[[email protected] sh]# ./exit.sh 
# 輸入abc
please input num: abc
# 指令碼返回請輸入數字
please input number, error!!!!

# 檢視$?變數,返回18,和我們指令碼中設定的一樣。
[[email protected] sh]# echo $?
18

# 再次執行指令碼,輸入123
[[email protected] sh]# ./exit.sh
please input num:123
# 指令碼返回結果是輸入的數字
# 證明指令碼符合需求。
123

3、break語句

特殊流程控制語句break語句的作用,當程式執行到break語句時,會結束整個迴圈(也就是跳出這個迴圈,繼續之後後邊的命令)。

continue語句也是結束迴圈的語句,不過continue語句跳過當前迴圈,繼續執行下一次迴圈。

看下示意圖解釋下break語句:

image

舉個例子:

先編寫一個不加break語句的指令碼break1.sh

[[email protected] sh]# vim sh/break1.sh


#!/bin/bash
# 輸出10次變數i的值
#迴圈十次
for((i=1;i<=10;i=i+1))
    do
        # 輸出變數i的值
        echo $i
done

執行該指令碼檢視結果:

[[email protected] sh]# chmod 755 break1.sh
[[email protected] sh]#./break1.sh
1
2
3
4
5
6
7
8
9
10

再編寫一個加break語句的指令碼break2.sh

[[email protected] ~]# vim sh/break2.sh


#!/bin/bash
# 輸出10次變數i的值
# 迴圈十次
for((i=1;i<=10;i=i+1))
    do
        # 如果變數i的值等於4
        if[ "$i" -eq 4 ]
            then
                # 退出整個迴圈
                break
        fi
        # 輸出變數i的值
        echo $i
done

執行該指令碼檢視結果:

[[email protected] sh]# chmod 755 break2.sh
[[email protected] sh]#./break2.sh
1
2
3

上面兩個指令碼的對比,可以看出當執行完break語句後,直接跳出了整個for迴圈。

4、continue語句

continue語句也是結束流程控制的語句。如果在迴圈中,continue語句只會結束當前單次迴圈,

畫個示意圖來說明下continue語句:

image

舉個例子:

直接編寫一個加continue語句的指令碼continue1.sh

來和上邊的break語句中的兩個指令碼進行對比。

[[email protected] ~]# vim sh/continue1.sh


#!/bin/bash
# 輸出10次變數i的值
# 迴圈十次
for((i=1;i<=10;i=i+1))
    do
        # 如果變數i的值等於4
        if[ "$i" -eq 4 ]
            then
                # 退出整個迴圈
                continue
        fi
        # 輸出變數i的值
        echo $i
done

執行該指令碼檢視結果:

[[email protected] sh]# chmod 755 continue1.sh
[[email protected] sh]#./continue1.sh
1
2
3
5
6
7
8
9
10

從上面結果可以看出,continue語句是把第四個迴圈跳過去了,然後繼續執行第5次迴圈。

這就是continue語句和break語句的區別。