概述
之前介紹了一些bash腳本編程的變量、運算、條件測試的一些基礎內容,了解了腳本實際上就是一些語句加上一些流程控制組合起來,實現某種功能的可執行文件。我們知道,條件測試的目的,實際就是為了實現一種流程的控制,那么本篇就簡單介紹一下bash里面常見的流程控制語句,包括選擇、循環等內容,具體包括以下幾個部分:
1、選擇控制之if語句
2、選擇控制之case語句
3、循環控制之for語句
4、循環控制之while語句
5、循環控制之until語句
6、break和continue的介紹
7、流程控制語句示例腳本
第一章 選擇控制之if語句
1、單分支if語句格式
if 判斷條件: then
條件為真的分支代碼
fi
2、雙分支if語句格式
if 判斷條件; then
條件為真的分支代碼
else
條件為假的分支代碼
fi
3、多分支if語句格式
if 判斷條件1; then
條件1為真的分支代碼
elif 判斷條件2; then
條件2為真的分支代碼
elif 判斷條件3; then
條件3為真的分支代碼
…
else
所有條件都不滿足執行的語句
fi
逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而后結束整個if語句
第二章 選擇控制之case語句
當用if來進行判斷時,如果條件中的值不是某一些連續的取值范圍,這時,如果依然用if來進行條件的過濾,代碼量將會大大增加。這時針對這些離散,沒有規律的取值對象進行選擇執行時,就需要用到case語句了。
case語句的語法格式為:
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
…
*)
默認分支
;;
esac
其中PAT為變量的取值,支持glob風格的通配符:
*: 任意長度任意字符
?: 任意單個字符
[]:指定范圍內的任意單個字符
a|b: a或b
第三章 循環控制之for語句
1、for的語法格式一
for 變量名 in 列表;do
循環體
done
此種模式下for的執行機制:
依次將列表中的元素賦值給“變量名”,每次賦值后即執行一次循環體,直到列表中的元素耗盡,循環結束
for中列表的生成方式:
<1> 直接給出列表
<2> 整數列表:
{start..end}
`seq [start [step]] end`
<3> 返回列表的命令 $(COMMAND)
<4> 使用glob, 如: *.sh
<5> 變量引用;$@, $
2、for的語法格式二
for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式))
do
循環體
done
控制變量初始化:僅在運行到循環代碼段時執行一次
控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而后再做條件判斷
例如:
for ((i=1;i<=10;i++))
do
echo "nihao"
done
第四章 循環控制之while語句
1、while的常規格式
while CONDITION; do
循環體
done
CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為 true,則執行一次循環;直到條件測試狀態為false終止循環。因此:CONDITION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
進入條件: CONDITION為true
退出條件: CONDITION為false
2、無限循環:
while true; do
循環體
done
3、while循環的特殊用法(遍歷文件的每一行):
while read line; do
循環體
done < /PATH/FROM/SOMEFILE
依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line
第五章 循環控制之until語句
1、常規until循環格式
until CONDITION; do
循環體
done
進入條件: CONDITION 為false
退出條件: CONDITION 為true
2、創建無限循環
until false; do
循環體
done
第六章 break和continue介紹
1、continue語句,用于循環體中
continue [N] 提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層
while CONDTIITON1; do
CMD1
…
if CONDITION2; then
continue
fi
CMDn
…
done
2、break語句
break [N] 提前結束第N層循環, 最內層為第1層
while CONDTIITON1; do
CMD1
…
if CONDITION2; then
break
fi
CMDn
…
done
第七章 流程控制語句示例腳本
1、寫個腳本:實現打印正邊三角形
#!/bin/bash # Autor: nwc # Version: 2.0 # CreateTime: 2016-08-17 # Description:利用循環語句,實現打印三角形 # * # *** # ***** # ******* #********* read -p "please input the lines: " Line echo "================A PROJECT==============" if expr $Line + 0 &>/dev/null && [ `expr $Line + 0` -gt 0 ];then for((i=1;i<=$Line;i++)){ for((S=$Line;S>i;S--)){ echo -n " " } for LS in `seq 1 $i`;do echo -ne "\033[31m*\033[0m" done for((RS=1;RS<i;RS++)){ echo -ne "\033[31m*\033[0m" } echo } else echo "wrong args" fi echo "================B PROJECT==============" if expr $Line + 0 &>/dev/null && [ `expr $Line + 0` -gt 0 ];then for((j=1;j<=$Line;j++)){ sp=$[${Line}-$j] st=$[$j*2-1] for((k=1;k<=$sp;k++)){ echo -n " " } for((m=1;m<=$st;m++)){ echo -ne "\033[31m*\033[0m" } echo } else echo "wrong args" fi unset Line unset i unset S unset LS unset RS unset j unset sp unset st unset k unset m
執行結果如下:
2、用until循環實現國際象棋棋盤
#!/bin/bash # Autor: nwc # Version: 2.0 # CreateTime: 2016-08-18 # Description:用unilt打印國際象棋棋盤 read -p "please input the lines: " line read -p "please input the rows: " row if [ $line -ge 1 ] &>/dev/null && [ $row -ge 1 ] &>/dev/null ;then l=1 r=1 #l和r分別代表初始行坐標和初始列坐標 w="\033[47m \033[0m" b="\033[40m \033[0m" until [ $l -gt $line ];do until [ $r -gt $row ];do m=$[($l+$r)%2] [ $m -eq 0 ] && echo -ne "$w" || echo -ne "$b" let r++ done echo let l++ r=1 done else echo "bad lines or rows" fi unset line unset row unset l unset r unset w unset b
執行效果為:
原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/36985