12結構化命令

正確的順序執行。然而,並不是全部程序都如此操做。
許多程序要求對shell腳本中的命令施加一些邏輯流程控制。有一類命令會根據條件使腳本跳過某些命令。這樣的命令一般稱爲結構化命令(structured command)。程序員

12 if-thenshell

最基本的結構化命令就是if-then語句。if-then語句有以下格式。
if command
then
commands
fiexpress

bash shell的if語句會運行if後面的那個命令。若是該命令的退出狀態碼(參見第11章)是0(該命令成功運行),位於then部分的命令就會被執行。若是該命令的退出狀態碼是其餘值, then部分的命令就不會被執行,bash shell會繼續執行腳本中的下一個命令。 fi語句用來表示if-then語句到此結束。編程

若是你在用其餘編程語言的if-then語句,這種形式可能會讓你有點困惑。在其餘編程語言中, if語句以後的對象是一個等式,這個等式的求值結果爲TRUE 或FALSE。但bash shell的if語句並非這麼作的。安全

test命令提供了在if-then語句中測試不一樣條件的途徑。
若是test命令中列出的條件成立,test命令就會退出並返回退出狀態碼0。這樣if-then語句就與其餘編程語言中的if-then 語句以相似的方式工做了。
若是條件不成立,test命令就會退出並返回非零的退出狀態碼,這使得
if-then語句不會再被執行。
--應該是適用於某些特殊狀況,通常而言這命令多餘bash

test命令的格式很是簡單。
test condition編程語言

bash shell提供了另外一種條件測試方法,無需在if-then語句中聲明test命令。
if [ condition ]
then
commands
fi
方括號定義了測試條件。
注意,第一個方括號以後和第二個方括號以前必須加上一個空格,不然就會報錯。
test命令能夠判斷三類條件:
 數值比較
 字符串比較
 文件比較ide

test命令和測試表達式使用標準的數學比較符號來表示字符串比較,而用文本代碼來表示數值比較。這個細微的特性被不少程序員理解反了。若是你對數值使用了數學運算符號,shell會將它們當成字符串值,可能沒法獲得正確的結果。測試

-d file 檢查file是否存在並是一個目錄
-e file 檢查file是否存在
-f file 檢查file是否存在並是一個文件命令行

bash shell提供了兩項可在if-then語句中使用的高級特性:
 用於數學表達式的雙括號
 用於高級字符串處理功能的雙方括號

雙括號命令的格式以下:
(( expression ))

&& 邏輯和
|| 邏輯或
! 邏輯求反

雙方括號命令的格式以下:
[[ expression ]]

說明 雙方括號在bash shell中工做良好。不過要當心,不是全部的shell都支持雙方括號。

有了case命令,就不須要再寫出全部的elif語句來不停地檢查同一個變量的值了。 case命令會採用列表格式來檢查單個變量的多個值。
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac

--比較數值用 -eq -lt -gt, 單方括號
比較字符串用 = \> \< ,單圓括號
雙圓括號可進行數學運算,雙方括號用==進行字符串比較,也不知道是不是隻適用於if-then。

case比較字符串用in,for也是用in
真是奇怪,每一個規則都不同

13 for

for var in list
do
commands
done

注意默認以空格區分變量列表,echo $IFS

變量拼接的方法

一個可參考的安全實踐是在改變IFS 以前保存原來的IFS值,以後再恢復它。這種技術能夠這樣實現:
IFS.OLD=$IFS
IFS=$'\n'
<在代碼中使用新的IFS值>
IFS=$IFS.OLD
這就保證了在腳本的後續操做中使用的是IFS的默認值。

若是要指定多個IFS字符,只要將它們在賦值行串起來就行。
IFS=$'\n':;"
這個賦值會將換行符、冒號、分號和雙引號做爲字段分隔符。如何使用IFS字符解析數據沒有任何限制。

13.3 while

while命令某種意義上是if-then語句和for循環的混雜體。 while命令容許定義一個要測試的命令,而後循環執行一組命令,只要定義的測試命令返回的是退出狀態碼0。它會在每次迭代的一開始測試test命令。在test 命令返回非零退出狀態碼時,while命令會中止執行那組命令。

while命令的格式是:
while test command
do
other commands
done

13.4 until
until命令和while命令工做的方式徹底相反。

13.5 嵌套循環

13.7 控制循環
你可能會想,一旦啓動了循環,就必須苦等到循環完成全部的迭代。並非這樣的。有兩個命令能幫咱們控制循環內部的狀況:
 break命令
 continue命令

有時你在內部循環,但須要中止外部循環。break命令接受單個命令行參數值:
break n

和break命令同樣,continue命令也容許經過命令行參數指定要繼續執行哪一級循環:
continue n

done > output.txt
shell會將 for命令的結果重定向到文件output.txt中,而不是顯示在屏幕上。

done | sort
這種方法一樣適用於將循環的結果管接給另外一個命令。

要讀取文件中的數據,得用上一點shell腳本編程技巧。咱們將IFS分隔符設置成逗號,並將
其放入while語句的條件測試部分。而後使用read命令讀取文件中的各行。實現代碼以下:
while IFS=’,’ read –r userid name
read命令會自動讀取.csv文本文件的下一行內容,因此不須要專門再寫一個循環來處理。

$ cat test26
#!/bin/bash

input="users.csv"while IFS=',' read -r userid namedoecho "adding $userid"useradd -c "$name" -m $useriddone < "$input"$

相關文章
相關標籤/搜索