Shell程式設計的流程控制

2021-04-26 16:51:02 字數 3685 閱讀 8144

和其他高階程式語言一樣,shell提供了用來控制程式執行流程的命令,包括條件分支和迴圈結構,使用者可以用這些命令建立非常複雜的程式。

與傳統語言不同的是,shell用於指定條件值的不是布林表示式,而是命令和字串。

1.測試命令

test命令用於檢查某個條件是否成立,它可以進行數值、字元和檔案3個方面的測試,其測試符和相應的功能分別如下。

(1)數值測試:

-eq 等於則為真。

-ne 不等於則為真。

-gt 大於則為真。

-ge 大於等於則為真。

-lt 小於則為真。

-le 小於等於則為真。

(2)字串測試:

= 等於則為真。

!= 不相等則為真。

-z字串 字串長度偽則為真。

-n字串 字串長度不偽則為真。

(3)檔案測試:

-e檔名 如果檔案存在則為真。

-r檔名 如果檔案存在且可讀則為真。

-w檔名 如果檔案存在且可寫則為真。

-x檔名 如果檔案存在且可執行則為真。

-s檔名 如果檔案存在且至少有乙個字元則為真。

-d檔名 如果檔案存在且為目錄則為真。

-f檔名 如果檔案存在且為普通檔案則為真。

-c檔名 如果檔案存在且為字元型特殊檔案則為真。

-b檔名 如果檔案存在且為塊特殊檔案則為真。

另外,linux還提供了與(!)、或(-o)、非(-a)三個邏輯操作符,用於將測試條件連線起來,其優先順序為:!最高,-a次之,-o最低。

同時,bash也能完成簡單的算術運算,格式如下:

$[expression]

例如:var1=2

var2=$[var1*10+1]

則var2的值為21。

2.if條件語句

shell程式中的條件分支是通過if條件語句來實現的,其一般格式為:

if 條件命令串

then

條件為真時的命令串

else

條件為假時的命令串

fi3.for迴圈

for迴圈對乙個變數的可能的值都執行乙個命令序列。賦給變數的幾個數值既可以在程式內以數值列表的形式提供,也可以在程式以外以位置引數的形式提供。for迴圈的一般格式為:

for變數名    [in數值列表]

do若干個命令列

done

變數名可以是使用者選擇的任何字串,如果變數名是var,則在in之後給出的數值將順序替換迴圈命令列表中的$var。如果省略了in,則變數var的取值將是位置引數。對變數的每乙個可能的賦值都將執行do和done之間的命令列表。

4.while和until迴圈

while和until命令都是用命令的返回狀態值來控制迴圈的。while迴圈的一般格式為:

while

若干個命令列1

do若干個命令列2

done

只要while的「若干個命令列1」中最後乙個命令的返回狀態為真,while迴圈就繼續執行do...done之間的「若干個命令列2」。

until命令是另一種迴圈結構,它和while命令相似,其格式如下:

until

若干個命令列1

do若干個命令列2

done

until迴圈和while迴圈的區別在於:while迴圈在條件為真時繼續執行迴圈,而until則是在條件為假時繼續執行迴圈。

shell還提供了true和false兩條命令用於建立無限迴圈結構,它們的返回狀態分別是總為0或總為非0。

5.case條件選擇

if條件語句用於在兩個選項中選定一項,而case條件選擇為使用者提供了根據字串或變數的值從多個選項中選擇一項的方法,其格式如下:

case string in

exp-1)

若干個命令列1

exp-2)

若干個命令列2

其他命令列

esac

shell通過計算字串string的值,將其結果依次和表示式exp-1, exp-2等進行比較,直到找到乙個匹配的表示式為止。如果找到了匹配項,則執行它下面的命令直到遇到一對分號(;;)為止。

在case表示式中也可以使用shell的萬用字元(「*」、「?」、「[ ]」)。通常用 * 作為case命令的最後表示式以便在前面找不到任何相應的匹配項時執行「其他命令列」的命令。

6.無條件控制語句break和continue

break用於立即終止當前迴圈的執行,而contiune用於不執行迴圈中後面的語句而立即開始下乙個迴圈的執行。這兩個語句只有放在do和done之間才有效。

7.函式定義

在shell中還可以定義函式。函式實際上也是由若干條shell命令組成的,因此它與shell程式形式上是相似的,不同的是它不是乙個單獨的程序,而是shell程式的一部分。函式定義的基本格式為:

functionname

若干命令列

呼叫函式的格式為:

functionname param1 param2…

shell函式可以完成某些例行的工作,而且還可以有自己的退出狀態,因此函式也可以作為if, while等控制結構的條件。

在函式定義時不用帶引數說明,但在呼叫函式時可以帶有引數,此時shell將把這些引數分別賦予相應的位置引數$1, $2, ...及$*。

8.命令分組

在shell中有兩種命令分組的方法:()和{}。前者當shell執行()中的命令時將再建立乙個新的子程序,然後這個子程序去執行圓括弧中的命令。當使用者在執行某個命令時不想讓命令執行時對狀態集合(如位置引數、環境變數、當前工作目錄等)的改變影響到下面語句的執行時,就應該把這些命令放在圓括弧中,這樣就能保證所有的改變只對子程序產生影響,而父程序不受任何干擾。{}用於將順序執行的命令的輸出結果用於另乙個命令的輸入(管道方式)。當我們要真正使用圓括弧和花括弧時(如計算表示式的優先順序),則需要在其前面加上轉義符(/)以便讓shell知道它們不是用於命令執行的控制所用。

9.訊號

trap命令用於在shell程式中捕捉訊號,之後可以有3種反應方式:

(1)執行一段程式來處理這一訊號。

(2)接受訊號的預設操作。

(3)忽視這一訊號。

trap對上面3種方式提供了3種基本形式:

第一種形式的trap命令在shell接收到與signal list清單中數值相同的訊號時,將執行雙引號中的命令串。

trap 'commands' signal-list

trap "commands" signal-list

為了恢復訊號的預設操作,使用第二種形式的trap命令:

trap signal-list

第三種形式的trap命令允許忽略訊號:

trap " " signal-list

注意:(1)對訊號11(段違例)不能捕捉,因為shell本身需要捕捉該訊號去進行記憶體的轉儲。

(2)在trap中可以定義對訊號0的處理(實際上沒有這個訊號),shell程式在其終止(如執行exit語句)時發出該訊號。

(3)在捕捉到signal-list中指定的訊號並執行完相應的命令之後,如果這些命令沒有將shell程式終止的話,shell程式將繼續執行收到訊號時所執行的命令後面的命令,這樣將很容易導致shell程式無法終止。

另外,在trap語句中,單引號和雙引號是不同的。當shell程式第一次碰到trap語句時,將把commands中的命令掃瞄一遍。此時若commands是用單引號括起來的話,那麼shell不會對commands中的變數和命令進行替換,否則commands中的變數和命令將用當時具體的值來替換。

Shell程式設計的流程控制

和其他高階程式語言一樣,shell提供了用來控制程式執行流程的命令,包括條件分支和迴圈結構,使用者可以用這些命令建立非常複雜的程式。與傳統語言不同的是,shell用於指定條件值的不是布林表示式,而是命令和字串。1 測試命令 test命令用於檢查某個條件是否成立,它可以進行數值 字元和檔案3個方面的測...

Shell 程式設計(五)Shell流程控制

if condition1 then command1 elif condition2 then command2 else commandn fi方式一 for n in12 3doecho ndone 或for n in12 3 do echo n done 或for n in do echo ...

Shell程式設計 流程控制 函式

目錄 分支語句 if,else,elif 分支語句 case 迴圈語句 函式if語句 判斷結構 if 比較的條件 then 條件成立執行的操作 fi if 比較的條件 then 條件成立執行的操作 else 條件不成立執行的操作 fi if 比較的條件 then 條件成立執行的操作 elif 比較的...