防偽碼:床前明月光,疑是地上霜。
流程控制是改變程序運行順序的指令。
f 4.1 if 語句
格式:if list; then list; [ elif list; then list; ] ... [ else list; ] fi
4.1.1 單分支
if 條件表達式; then
命令
fi
示例:
#!/bin/bash
N=10
if [ $N -gt 5 ]; then
echo yes
fi
# bash test.sh
yes
4.1.2 雙分支
if 條件表達式; 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 條件表達式; then
命令
elif 條件表達式; 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
默認 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 # 恢復默認值
# bash a.sh
12
34
45
for 循環(huán)還有一種 C 語言風格的語法,常用于計數(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 條件表達式; 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
當條件表達式為 true 時,終止循環(huán)。
示例 2:條件表達式為 true,將會產(chǎn)生死循環(huán)
#!/bin/bash
while [ 1 -eq 1 ]; do
echo "yes"
done
也可以條件表達式直接用 true:
#!/bin/bash
while true; do
echo "yes"
done
還可以條件表達式用冒號,冒號在 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 # 讀取文件作為標準輸出
while read LINE; do
echo $LINE
done
與 while 關(guān)聯(lián)的還有一個 until 語句,它與 while 不同之處在于,是當條件表達式為 false 時才循
環(huán),實際使用中比較少,這里不再講解。
4.4 k break 和 和 e continue 語句
break 是終止循環(huán)。
continue 是跳出當前循環(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
當變量 N 等于 3 時,continue 跳過了當前循環(huán),沒有執(zhí)行下面的 echo。
注意:e continue 與 與 k break 語句只能循環(huán)語句中使用。
4.5 5 e case 語句
case 語句一般用于選擇性來執(zhí)行對應部分塊命令。
格式: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.
上面例子是不是有點眼熟,在 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é)單獨講解 Shell 正則表達式。
4.6 6 t select 語句
select 是一個類似于 for 循環(huán)的語句。
格式:select name [ in word ] ; do list ; done
select 變量 in 選項 1 選項 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í)行相應的命令,如果用 if 語句多分支的話要復雜許多,用 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
如果不想用默認的提示符,可以通過重新賦值變量 PS3 來自定義。這下就比較完美了!
謝謝觀看,真心的希望能幫到您!
本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!
更多建議: