天天看點

shell腳本編寫 之 條件選擇,條件判斷,循環語句

1 概述

編寫shell腳本,一般離不開條件選擇,條件判斷以及循環語句。掌握這三個文法,将大大提高腳本的編寫效率,使得腳本編寫更加靈活,完成x相對複雜的工作

2 條件選擇if語句

if語句選擇執行,逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而後結束整個if語句

if是根據判讀條件的指令的退出狀态來執行指令,if語句可嵌套

單分支

雙分支

多分支

例子

比較數字大小結果真假判斷

執行指令結果真假判斷

3 條件判斷:case語句

文法如下

這裡的分支x可以是指令的組合,不是單純的一條指令

case支援glob風格的通配符:

*: 任意長度任意字元

?: 任意單個字元

[]:指定範圍内的任意單個字元

a|b: a或b,當比對到不同的字元,但是要執行相同的分支指令是,可以用這個指令簡化判斷

截圖如下

shell腳本編寫 之 條件選擇,條件判斷,循環語句

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循環的執行過程如下

進入循環的時候,先不判斷真假,直接執行 控制變量初始化

然後執行  條件判斷表達式 ,會判斷真假 ,條件為真,開始進入循環

執行循環

執行完循環後

執行  控制變量的修正表達式

然後條件判斷表達式

然後條件判斷表達式,

。。。。。。。

直到不滿足條件判斷表達式這個條件後退出循環

邏輯圖如下

shell腳本編寫 之 條件選擇,條件判斷,循環語句

以上腳本通過調試 bash -x 結果截圖如下

shell腳本編寫 之 條件選擇,條件判斷,循環語句

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來寫循環語句,但是有一個原則就是,盡量把算法定好,防止多次的循環,占用大量的資源,對系統造成負擔。