shell程式設計4

2021-09-05 18:15:39 字數 4469 閱讀 5973

for迴圈有兩種形式:

基本格式如下:

for var in list 

do commands

done

list代表要迴圈的值,在每次迴圈的時候,會把當前的值賦值給var(變數名而已,隨意定), 這樣在迴圈體中就可以直接通過$var獲取當前值了。

先來乙個例子吧:

#!/bin/bash

for str in a b c d e

do echo $str

done

以上會根據空格將abcde分割,然後依次輸出出來。

如果以上例子不是以空格分割,而是以逗號(,)分割呢?

#!/bin/bash

list="a,b,c,d,e"

for str in $list

do echo $str

done

結果輸出a,b,c,d,e

造成這個結果的原因是:for...in迴圈預設是迴圈一組通過空格或製表符(tab鍵)或換行符(enter鍵)分割的值。這個其實是由內部字段分隔符配置的,它是由系統環境變數ifs定義的。當然,既然是由環境變數定義的,那當然也就能修改啊。

#!/bin/bash

#定義乙個變數oldifs儲存未修改前的ifs的值

oldifs=$ifs

#修改ifs值,以逗號為分隔符

ifs=$','

list=a,b,c,d,e

list2="a b c d e"

for var in $list

do echo $var

done

for var2 in $list2

do echo $var2

done

#還原ifs的值

ifs=$oldifs

以上第乙個迴圈會分別輸出abcde幾個值。而第二個迴圈會輸出a b c d e(即未處理)。因為我們把ifs的值設定為逗號了, 當然,不一定要是逗號,想設定什麼,你說了算!

bash中c語言風格的for迴圈遵循如下格式:

for (( variable assignment ; condition ; iteration process ))

乙個例子足以說明:

#!/bin/bash

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

do echo $i

done

上面例子迴圈11次,從0到10依次輸出。稍微有過程式設計基礎的都對此應該很熟悉。就不做詳細闡述了。

while test command 

do other commands

done

與if-then語句一樣,後面接test命令,如果test後面的命令的退出狀態碼為0. 那麼就進入迴圈,執行do後面的邏輯。要注意在do後面的邏輯中寫條件,避免死迴圈。

既然是接test命令,那麼一切都可以參考if-then的test

示例一:

#!/bin/bash

flag=0

while test $flag -le 10

do echo $flag

# 如果沒有這句,那麼flag的值一直為0,就會無限迴圈執行

flag=$[$flag + 1]

done

以上判斷flag是否大於或者等於10, 如果滿足條件,那麼輸出當前flag的值,然後再將flag的值加1。最終輸出的結果為0到10的結果。

示例二:

#!/bin/bash

flag=0

while [ $flag -le 10 ]

do echo $flag

flag=$[$flag + 1]

done

示例三:

flag=0

while (( $flag <= 10 ))

do echo $flag

flag=$[$flag + 1]

done

until語句基本格式如下:

until test commands

do other commands

done

在掌握while迴圈語句之後, until語句就很簡單了。until語句就是與while語句恰好相反, while語句是在test命令退出狀態碼為0的時候執行迴圈, 而until語句是在test命令退出狀態碼不為0的時候執行。

示例:

#!/bin/bash

flag=0

until (( $flag > 10 ))

do echo $flag

flag=$[ $flag + 1 ]

done

以上輸出0到10的值。until後面的條件與上面while例子完全相反。

好啦,到此,我們學完了shell的迴圈語句啦。不過上面我們寫的迴圈語句都是根據條件執行完畢,如果我們在執行的過程中想退出,該怎麼辦?接下來就繼續看看怎麼控制迴圈語句。

與其它程式語言一樣,shell是通過break和continue命令來控制迴圈的。下面就分別來看看二者的基本用法:

break用於跳出當前迴圈

示例一:

#!/bin/bash

for (( flag=0; flag <= 10; flag++ ))

do if (( $flag == 5 ))

then

break

fiecho $flag

done

以上當flag的值為5的時候,退出迴圈。輸出結果為0-4的值。

break用於跳出內層迴圈

示例二:

#!/bin/bash

flag=0

while (( $flag < 10 ))

do for (( innerflag=0; innerflag < 5; innerflag++ ))

doif (( $innerflag == 2 ))

then

break

fiecho "innerflag=$innerflag"

done

echo "outerflag=$flag"

done

以上**在執行內部迴圈for的時候,當innerflag值為2的時候就會跳出到外層的while迴圈, 由於外層迴圈一直flag都為0, 所以while會成為乙個死迴圈,不停的輸出:

innerflag=0

innerflag=1

outerflag=0

break用於跳出外層迴圈

break 可後接數字,用於表示退出當前迴圈的外層的第幾層迴圈。

示例三:

#!/bin/bash

flag=0

while (( $flag < 10 ))

do for (( innerflag=0; innerflag < 5; innerflag++ ))

doif (( $innerflag == 2 ))

then

# 2表示外面一層迴圈

break 2

fiecho "innerflag=$innerflag"

done

echo "outerflag=$flag"

done

與上面例子相比,本例就只是在break後面跟了個數字2,表示退出外面的第一層迴圈。最終輸出:

innerflag=0

innerflag=1

continue表示終止當前的一次迴圈,進入下一次迴圈,注意,continue後面的語句不會執行。

continue的語法與break一樣,因此,就只做乙個示例演示啦。

示例:

flag=0

while (( $flag <= 10 ))

do if (( $flag == 5 ))

then

flag=$[$flag+1]

continue

fiecho "outerflag=$flag"

for (( innerflag=11; innerflag < 20; innerflag++ ))

doif (( $innerflag == 16 ))

then

flag=$[$flag+1]

continue 2

fiecho "innerflag=$innerflag"

done

done

shell程式設計(4)

引數置換變數 引數置換變數是另一種為變數賦值的方式,其一般形式是 變數 2 其中,op標識操作符,它可以是下列四個操作符之一 變數2的值取決於變數1 引數 是否為空串 利用哪個操作符以及字串的取值。在使用格式上應注意,操作符的前後不留空格。1.變數2 如果變數1的值為空,則變數2的值等於給定的字串,...

shell程式設計100例(4)

16 進度條,動態時針版本 定義乙個顯示進度的函式,螢幕快速顯示 bin bash rotate line rotate line 17 99 乘法表 bin bash for i inseq 9 i從1到9取值的迴圈 dofor j inseq i j從1到9 取值的迴圈 doecho n j j...

shell程式設計100例(4)

1 判斷檔案或目錄是否存在 bin bash 判斷檔案或目錄是否存在 if eq 0 then echo 未輸入任何引數,請輸入引數 echo 用法 0 檔名 目錄名 fiif f 1 then echo 該檔案,存在 ls l 1 else echo 沒有該檔案 fiif d 1 then ech...