Shell程式或者說其他的程式,都是順序執行的,也就是第一行執行完再執行第二行,以此類推,依次執行。
而流程控制語句,如:
if
條件判斷語句,你只有條件成立了,才能夠執行,否則就不執行其中的程式,這就會跳過一些執行命令。for
迴圈也是流程控制類語句,是重複執行指定次數的相同程式碼。除了上面的條件判斷語句和迴圈語句外,還有特殊流程控制語句。
比如:exit
語句、break
語句、continue
語句。
系統有一個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指令碼賦予執行許可權
[root@localhost sh]# chmod 755 exit.sh
# 執行指令碼
[root@localhost sh]# ./exit.sh
# 輸入abc
please input num: abc
# 指令碼返回請輸入數位
please input number, error!!!!
# 檢視$?變數,返回18,和我們指令碼中設定的一樣。
[root@localhost sh]# echo $?
18
# 再次執行指令碼,輸入123
[root@localhost sh]# ./exit.sh
please input num:123
# 指令碼返回結果是輸入的數位
# 證明指令碼符合需求。
123
特殊流程控制語句break
語句的作用,當程式執行到break
語句時,會結束整個迴圈(也就是跳出這個迴圈,繼續之後後邊的命令)。
而continue
語句也是結束迴圈的語句,不過continue
語句跳過當前回圈,繼續執行下一次迴圈。
看下示意圖解釋下break
語句:
舉個例子:
先編寫一個不加break
語句的指令碼break1.sh
。
[root@localhost sh]# vim sh/break1.sh
#!/bin/bash
# 輸出10次變數i的值
#迴圈十次
for((i=1;i<=10;i=i+1))
do
# 輸出變數i的值
echo $i
done
執行該指令碼檢視結果:
[root@localhost sh]# chmod 755 break1.sh
[root@localhost sh]#./break1.sh
1
2
3
4
5
6
7
8
9
10
再編寫一個加break
語句的指令碼break2.sh
。
[root@localhost ~]# 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
執行該指令碼檢視結果:
[root@localhost sh]# chmod 755 break2.sh
[root@localhost sh]#./break2.sh
1
2
3
上面兩個指令碼的對比,可以看出當執行完
break
語句後,直接跳出了整個for
迴圈。
continue
語句也是結束流程控制的語句。如果在迴圈中,continue
語句只會結束當前單次迴圈,
畫個示意圖來說明下continue
語句:
舉個例子:
直接編寫一個加continue
語句的指令碼continue1.sh
。
來和上邊的break
語句中的兩個指令碼進行對比。
[root@localhost ~]# 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
執行該指令碼檢視結果:
[root@localhost sh]# chmod 755 continue1.sh
[root@localhost sh]#./continue1.sh
1
2
3
5
6
7
8
9
10
從上面結果可以看出,
continue
語句是把第四個迴圈跳過去了,然後繼續執行第5次迴圈。這就是
continue
語句和break
語句的區別。