1 概述
編寫shell腳本,一般離不開條件選擇,條件判斷以及循環語句。掌握這三個文法,将大大提高腳本的編寫效率,使得腳本編寫更加靈活,完成x相對複雜的工作
2 條件選擇if語句
if語句選擇執行,逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而後結束整個if語句
if是根據判讀條件的指令的退出狀态來執行指令,if語句可嵌套
單分支
雙分支
多分支
例子
比較數字大小結果真假判斷
執行指令結果真假判斷
3 條件判斷:case語句
文法如下
這裡的分支x可以是指令的組合,不是單純的一條指令
case支援glob風格的通配符:
*: 任意長度任意字元
?: 任意單個字元
[]:指定範圍内的任意單個字元
a|b: a或b,當比對到不同的字元,但是要執行相同的分支指令是,可以用這個指令簡化判斷
截圖如下
4 循環語句
将某代碼段重複運作多次,以下三個關鍵字for, while, until各自的文法構成不同的循環語句
其中
for預設将清單的值依次執行完成後退出
while和until有進入條件和退出條件
重複運作的次數有兩類
a.循環次數事先已知
b.循環次數事先未知
4.1 for 循環
4.1.1 for 正常的清單循環
文法如下:
for循環執行機制:
依次将清單中的元素指派給“變量名”; 每次指派後即執行一次循環體; 直到清單中的元素耗盡,循環結束
for循環 清單 生成方式:
(1) 直接給出清單
(2) 整數清單:
(a) {start..end}
(b) $(seq[start [step]] end)
(3) 傳回清單的指令:$(command) 可以表達為`command`,反向單引号引起來
(4) 使用glob,如:*.sh
(5) 變量引用;$@, $*
4.1.2 例子:
4.1.2.1 直接給出清單型
4.1.2.2 整數清單:{start..end..step}型
如果不指定步進值(step),那麼預設是步進1
4.1.2.3 整數清單:$(seq[start [step]] end) 型
#如果是 seq end 從1開始遞增到end,每次增加1
#如果是 seq start end 從start開始遞增到end,每次遞增1
#如果是 seq[start] [step] [end] 從start開始,每次遞增step,直到end
4.1.2.4 傳回清單的指令 $(command)型
4.1.2.5 使用glob,如:*.sh或/root/* 型
4.1.2.6 變量引用;$@, $*型
4.1.3 for循環的特殊格式:
控制變量初始化:僅在運作到循環代碼段時執行一次
控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而後再做條件判斷
雙小括号方法,即((…))格式,也可以用于算術運算
雙小括号方法也可以使bash shell實作c語言風格的變量操作,如((i++))
該for循環的執行過程如下
進入循環的時候,先不判斷真假,直接執行 控制變量初始化
然後執行 條件判斷表達式 ,會判斷真假 ,條件為真,開始進入循環
執行循環
執行完循環後
執行 控制變量的修正表達式
然後條件判斷表達式
然後條件判斷表達式,
。。。。。。。
直到不滿足條件判斷表達式這個條件後退出循環
邏輯圖如下
以上腳本通過調試 bash -x 結果截圖如下
4.2 while循環
4.2.1 文法
condition:循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;
條件為“true”,則執行一次循環;直到條件測試狀态為“false”終止循環
是以:condtion一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
進入條件:condition為true
退出條件:condition為false
4.2.2 while循環的特殊用法:
4.2.2.1 讀入檔案
依次讀取/path/from/somefile這個檔案中的每一行,且将行指派給變量line,每次讀入一行進入循環,進行相應的處理
4.2.2.2 将結果傳入while
将指令的結果傳給while,用管道來傳,每次讀入指令結果得到一行
4.2.2.3 建立無限循環
4.2.3例子
4.2.3.1 普通循環 九九乘法表
4.2.3.2 讀入文檔内容
while 每一次會把輸入的文檔/root/tt的每一行輸入進行處理,等這行完成處理後,
再輸入文檔的下一行,直到所有的循環都結束
4.2.3.3 管道輸入
以下指令将 df|grep /dev/sd 的結果通過管道一行一行傳入給到變量line。然後進入循環做處理
4.2.3.4 建立循環體
每個兩秒列印hello
4.3 until
4.3.1 文法
進入條件:condition 為false
退出條件:condition 為true
until就是和while相反,一般可以用until實作的循環,都可以用while來實作,是以until可以了解一下即可。
建立無限循環
4.3.2 例子
4.3.2.1 until普通循環
當i大于6的時候進入循環,小于或者等于6的時候退出循環
4.3.2.2 無效循環的腳本
列印it is false,然後睡2秒
5 小結
使用什麼文法進行循環,或者是條件選擇或者條件判斷,都要根據具體情況來定,同時也是根據個人寫腳本的習慣而定,比如有些人就喜歡用while來寫循環語句,但是有一個原則就是,盡量把算法定好,防止多次的循環,占用大量的資源,對系統造成負擔。