Shell指令碼基本流程控制語句總結

2021-09-01 10:24:30 字數 3942 閱讀 9204

通常我們將一些命令寫在乙個檔案中就算是乙個shell指令碼了,但是如果需要執行更複雜的邏輯判斷,我們就需要流程控制語句來支援。現在我就總結一下shell流程控制語句語法以及常用形式(我一直覺得沒有必要什麼都學,而是用自己擅長的方式去解決所有遇到的問題)

[size=medium][b]1.if條件[/b][/size]

if 條件; then

#statements1

else

#statements2

fi

這裡的條件通常是乙個命令,[b]當命令的退出狀態碼返回0,表示條件為真[/b],這時候執行statements1,否則執行statements2

我們看乙個例子(判斷字串中是否包含指定字元):

str="hello world";

if echo "$str" | grep -q "ll" ; then #grep 中的-q引數表示silent模式--禁止輸出

echo "$str contains ll"

else

echo "$str doesn't contain ll"

fi

我們看下執行結果:

[img]

[b][ ]命令[/b]通常是if語句中最常用的命令(條件測試命令),我們使用它可以做一些檔案,字串或者是數值的判斷,下面我們看乙個例子:

if [ -e "/etc/passwd" ]; then

size=`ls -l -h /etc/passwd | awk ''`

echo "/etc/passwd file is exised, and it's size is $size"

fistr1="nanjing"

str2="beijing"

if [ "$str1" = "$str2" ]; then

echo "$str1 equals to $str2"

else

echo "$str1 doesn't equals to $str2"

finum1=100

num2=105

if [ "$num1" -gt "$num2" ]; then

echo "$num1 is greater than $num2"

else

echo "$num1 is not greater than $num2"

fi

執行結果如圖:

[img]

關於[ ]命令(實際上就是test命令的另一種形式)更多引數說明,可以參看我之前寫的一篇文章:[url]

[b]另外還有一點需要補充的是:[/b]

1. test, [ ], /usr/bin/test, 和 /usr/bin/[ 都是等價命令;

2. 其中test 和 [ ] 是bash的內建命令,而/usr/bin/test 和 /usr/bin/[ 是乙個外部命令;

3. 在bash指令碼中, test命令不會呼叫外部的/usr/bin/test命令, 它呼叫的是sh-utils工具包中內建test命令. 同樣的, [ 也並不會呼叫 /usr/bin/[

[img]

[size=medium][b]2.for迴圈[/b][/size]

通常for迴圈有3種常用的形式:

for i in 列表; do   #兩邊沒有括號,請記住

#statements

done

在迴圈的每次執行中, i將順序的訪問列表中列出的變數,我們看乙個例子

city="nanjing shanghai hangzhou beijing"

for city in $city; do

echo $city

done

執行結果如圖:

[img]

日常生活中,我們通常會有遍歷某個目錄下所有檔案的需求,我們可以這樣做

for file in `ls`; do

echo $file

done

或者

for file in *; do

echo $file

done

執行結果如圖:

[img]

如果我們只是希望簡單的控制迴圈次數,我們可以使用下面這種形式

for i in $(seq 5); do   #個人更喜歡這種形式,$(...)是bash的變數替換

echo $i

done

如果你是乙個c程式設計師,我想下面的形式,你會更加喜歡:

for (( i = 0; i < 10; i++ )); do

#statements

done

使用這種格式的for迴圈,在(( ))中引用的shell變數不需要使用$,eg:

limit=10

for (( i = 0; i < limit; i++ )); do

echo $i

done

[b]注意,我在ubuntu12.04執行這個指令碼的時候,出現了bad for loop variable錯誤,解決方法也很簡單:[/b][url]

[size=medium][b]3.while迴圈[/b][/size]

while 條件; do

#statements

done

同if條件語句一樣,這裡的條件通常是乙個命令,當命令的退出狀態碼返回0,表示條件為真,這時候執行statements,直到條件為假(命令返回非0)

while迴圈我用的比較少,通常是用來迴圈讀取乙個乙個檔案

cat $file | while read line ; do

echo $line

done

[size=medium][b]4.[[ ]] 與 (( ))[/b][/size]

[[ ]] 是乙個擴充套件命令(bash內建命令),它基本上與[ ]用法一致,並且更強大也更符合程式設計師的使用習慣;

a.當我們使用[ ]來測試兩個並列條件,我們有兩種做法:[ 條件1 -a 條件2 ] 或者 [ 條件1 ] && [ 條件2 ] 但使用我們可以這樣做:[[ 條件1 && 條件2 ]]

b.[[ ]] 支援更多的操作符(不許要額外的轉義並且語法上更符合一般的程式語言),譬如比較數字[ ]中使用的是類似-eq, -gt等操作符,而[[ ]]直接支援》, 《等操作符更詳細的文件說明:[url]

(( ))是 乙個算術運算命令(不是乙個真的命令,感覺像是乙個bash關鍵字),有了它, 我們基本可以廢棄expr命令的使用,並且大大提高了指令碼的執行效率,我們具體看幾個例子(它的語法和c語言很像):

a=$(( 100 + 1 ))

echo $a

a=$(( a++ ))

echo $a

a=$(( 100 / 3 ))

echo $a

a=$(( 100 * 2 ))

echo $a

我們看下執行結果:

[img]

似乎有乙個不成文的約定,字串比較使用[[ ]] ,數值比較使用(( ))

[size=medium][b]5.學習資料[/b][/size]

[url]

[url]

由於文件中的**都攜帶行號,所以複製完後又要乙個個刪除,很是麻煩,於是我寫了個命令,這樣就簡單多了:

sed -i 's/ *[0-9][0-9]* //' test.sh

[img]

shell指令碼之流程控制語句

一 分支控制語句 1 if fi條件 if condition then action fi2 if else fi條件 if condition then action else action fi3 if else if else fi條件 if condition then action el...

Shell流程控制語句

在linux shell程式設計中,if for while case等條件流程控制語句用的非常多,把這些學好,對提公升指令碼的功力有非常大的幫助。下面將逐個來講解具體的用法 if 表示式 if variable in array 語句1else 語句2fi 案例一,測試數字大小 bin sh nu...

shell流程控制語句

任何程式語言都離不開流程控制語句,其實程式設計基本上就是掌握了流程控制語句,然後加上函式 或者是方法 以及變數基本就差不多了,語法的東西很少,主要還是處理邏輯。所以,邏輯思維很重要。對於計算機來說,它只知道有或者沒有,是正或者是負,有電或者沒電,其實就是1和0的事兒。因此,if語句很重要,但又很簡單...