Shell流程控制

2018-06-08 17:07 更新

防偽碼:床前明月光,疑是地上霜。

流程控制是改變程序運(yùn)行順序的指令。

f 4.1 if  語句

格式:if list; then list; [ elif list; then list; ] ... [ else list; ] fi

4.1.1 單分支

if 條件表達(dá)式; then

命令

fi

示例:

#!/bin/bash

N=10

if [ $N -gt 5 ]; then

echo yes

fi

# bash test.sh

yes

4.1.2 雙分支

if 條件表達(dá)式; then

命令

else

命令

fi

示例:

#!/bin/bash

N=10

if [ $N -lt 5 ]; then

echo yes

else

echo no

fi

# bash test.sh

no

4.1.3 多分支

if 條件表達(dá)式; then

命令

elif 條件表達(dá)式; then

命令

else

命令

fi

示例:

#!/bin/bash

N=10

if [ $N -gt 5 ]; then

echo "gt 5"

elif [ $N -gt 6 ]; then

echo "gt 6"

else

echo no

fi

如果第一個條件符合就不再向下匹配。

r 4.2 for  語句

格式:for name [ [ in [ word ... ] ] ; ] do list ; done

for 變量名 in 取值列表; do

命令

done

示例:

#!/bin/bash

for i in {1..3}; do

echo $i

done

# bash test.sh

1

2

3

默認(rèn) for 循環(huán)的取值列表是以空白符分隔,也就是第一章講系統(tǒng)變量里的$IFS:

#!/bin/bash

for i in 12 34; do

echo $i

done

# bash test.sh

12

34

如果想指定分隔符,可以重新賦值$IFS 變量:

#!/bin/bash

OLD_IFS=$IFS

IFS=":"

STR="12:34:45"

for i in $STR; do

echo $i

done

IFS=$OLD_IFS # 恢復(fù)默認(rèn)值

# bash a.sh

12

34

45

for 循環(huán)還有一種 C 語言風(fēng)格的語法,常用于計(jì)數(shù)、打印數(shù)字序列:

for (( expr1 ; expr2 ; expr3 )) ; do list ; done

#!/bin/bash

for ((i=1;i<=5;i++)); do # 也可以 i--

echo $i

done

 4.3 while  語句

格式:while list; do list; done

while 條件表達(dá)式; do

命令

done

示例 1:

#!/bin/bash

N=0

while [ $N -lt 5 ]; do

let N++

echo $N

done

# bash test.sh

1

2

3

4

5

當(dāng)條件表達(dá)式為 true 時,終止循環(huán)。

示例 2:條件表達(dá)式為 true,將會產(chǎn)生死循環(huán)

#!/bin/bash

while [ 1 -eq 1 ]; do

echo "yes"

done

也可以條件表達(dá)式直接用 true:

#!/bin/bash

while true; do

echo "yes"

done

還可以條件表達(dá)式用冒號,冒號在 Shell 中的意思是不做任何操作。但狀態(tài)是 0,因此為 true:

#!/bin/bash

while :; do

echo "yes"

done

示例 3:逐行處理文本

文本內(nèi)容:

# cat a.txt

a b c

1 2 3

x y z

要想使用 while 循環(huán)逐行讀取 a.txt 文件,有三種方式:

方式 1:

#!/bin/bash

cat ./a.txt | while read LINE; do

echo $LINE

done

方式 2:

#!/bin/bash

while read LINE; do

echo $LINE

done < ./a.txt

方式 3:

#!/bin/bash

exec < ./a.txt # 讀取文件作為標(biāo)準(zhǔn)輸出

while read LINE; do

echo $LINE

done

與 while 關(guān)聯(lián)的還有一個 until 語句,它與 while 不同之處在于,是當(dāng)條件表達(dá)式為 false 時才循

環(huán),實(shí)際使用中比較少,這里不再講解。

4.4 k break 和 和 e continue  語句

break 是終止循環(huán)。

continue 是跳出當(dāng)前循環(huán)。

示例 1:在死循環(huán)中,滿足條件終止循環(huán)

#!/bin/bash

N=0

while true; do

let N++

if [ $N -eq 5 ]; then

break

fi

echo $N

done

# bash test.sh

1

2

3

4

里面用了 if 判斷,并用了 break 語句,它是跳出循環(huán)。與其關(guān)聯(lián)的還有一個 continue 語句,它是

跳出本次循環(huán)。

示例 2:舉例子說明 continue 用法

#!/bin/bash

N=0

while [ $N -lt 5 ]; do

let N++

if [ $N -eq 3 ]; then

continue

fi

echo $N

done

# bash test.sh

1

2

4

5

當(dāng)變量 N 等于 3 時,continue 跳過了當(dāng)前循環(huán),沒有執(zhí)行下面的 echo。

注意:e continue 與 與 k break  語句只能循環(huán)語句中使用。

4.5 5 e case  語句

case 語句一般用于選擇性來執(zhí)行對應(yīng)部分塊命令。

格式:case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac

case 模式名 in

模式 1)

命令

;;

模式 2)

命令

;;

*)

不符合以上模式執(zhí)行的命令

esac

每個模式必須以右括號結(jié)束,命令結(jié)尾以雙分號結(jié)束。

示例:根據(jù)位置參數(shù)匹配不同的模式

#!/bin/bash

case $1 in

start)

echo "start."

;;

stop)

echo "stop."

;;

restart)

echo "restart."

;;

*)

echo "Usage: $0 {start|stop|restart}"

esac

# bash test.sh

Usage: test.sh {start|stop|restart}

# bash test.sh start

start.

# bash test.sh stop

stop.

# bash test.sh restart

restart.

上面例子是不是有點(diǎn)眼熟,在 Linux 下有一部分服務(wù)啟動腳本都是這么寫的。

模式也支持正則,匹配哪個模式就執(zhí)行那個:

#!/bin/bash

case $1 in

[0-9])

echo "match number."

;;

[a-z])

echo "match letter."

;;

'-h'|'--help')

echo "help"

*)

echo "Input error!"

exit

esac

# bash test.sh 1

match number.

# bash test.sh a

match letter.

# bash test.sh -h

help

# bash test.sh --help

help

模式支持的正則有:*、?、[ ]、[.-.]、|。后面有章節(jié)單獨(dú)講解 Shell 正則表達(dá)式。

4.6 6 t select  語句

select 是一個類似于 for 循環(huán)的語句。

格式:select name [ in word ] ; do list ; done

select 變量 in 選項(xiàng) 1 選項(xiàng) 2; do

break

done

示例:

#!/bin/bash

select mysql_version in 5.1 5.6; do

echo $mysql_version

done

# bash test.sh

1) 5.1

2) 5.6

#? 1

5.1

#? 2

5.6

用戶輸入編號會直接賦值給變量 mysql_version。作為菜單用的話,循環(huán)第二次后就不再顯示菜單

了,并不能滿足需求。

在外面加個死循環(huán),每次執(zhí)行一次 select 就 break 一次,這樣就能每次顯示菜單了:

#!/bin/bash

while true; do

select mysql_version in 5.1 5.6; do

echo $mysql_version

break

done

done

# bash test.sh

1) 5.1

2) 5.6

#? 1

5.1

1) 5.1

2) 5.6

#? 2

5.6

1) 5.1

2) 5.6

如果再判斷對用戶輸入的編號執(zhí)行相應(yīng)的命令,如果用 if 語句多分支的話要復(fù)雜許多,用 case 語

句就簡單多了。

#!/bin/bash

PS3="Select a number: "

while true; do

select mysql_version in 5.1 5.6 quit; do

case $mysql_version in

5.1)

echo "mysql 5.1"

break

;;

5.6)

echo "mysql 5.6"

break

;;

quit)

exit

;;

*)

echo "Input error, Please enter again!"

break

esac

done

done

# bash test.sh

1) 5.1

2) 5.6

3) quit

Select a number: 1

mysql 5.1

1) 5.1

2) 5.6

3) quit

Select a number: 2

mysql 5.6

1) 5.1

2) 5.6

3) quit

Select a number: 3

如果不想用默認(rèn)的提示符,可以通過重新賦值變量 PS3 來自定義。這下就比較完美了!

謝謝觀看,真心的希望能幫到您!

本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號