其實作為命令語言互動式地解釋和執行使用者輸入的命令只是Shell功能的一個方面,Shell還可以用來進行程式設計,它提供了定義變數和參數的手段以及豐富的程式控制結構。使用Shell編程類似於DOS中的批次檔,稱為Shell script,又叫Shell程式或Shell命令檔案。
Shell基本文法
像進階程式設計語言一樣,Shell也提供說明和使用變數的功能。對Shell來講,所有變數的取值都是一個字串,Shell程式採用$var的形式來引用名為var的變數的值。
Shell有以下幾種基本類型的變數。
(1)Shell定義的環境變數:
Shell在開始執行時就已經定義了一些和系統的工作環境有關的變數,使用者還可以重新定義這些變數,常用的Shell環境變數有:
HOME 用於儲存註冊目錄的完全路徑名。
PATH 用於儲存用冒號分隔的目錄路徑名,Shell將按PATH變數中給出的順序搜尋這些目錄,找到的第一個與命令名稱一致的可執行檔將被執行。
TERM 終端的類型。
UID 目前使用者的識別字,取值是由數位構成的字串。
PWD 當前工作目錄的絕對路徑名,該變數的取值隨cd命令的使用而變化。
PS1 主提示符,在特權使用者下,預設的主提示符是#,在普通使用者下,預設的主提示符是$。
PS2 在Shell接收使用者輸入命令的過程中,如果使用者在輸入行的末尾輸入“\”然後斷行符號,或者當使用者按斷行符號鍵時Shell判斷出使用者輸入的命令沒有結束時,就顯示這個輔助提示符,提示使用者繼續輸入命令的其餘部分,預設的輔助提示符是>。
(2)使用者定義的變數:
使用者可以按照下面的文法規則定義自己的變數:
變數名=變數值
要注意的一點是,在定義變數時,變數名前不應加符號$,在引用變數的內容時則應在變數名前加$;在給變數賦值時,等號兩邊一定不能留空格,若變數中本身就包含了空格,則整個字串都要用雙引號括起來。
在編寫Shell程式時,為了使變數名和命令名相區別,建議所有的變數名都用大寫字母來表示。
有時我們想要在說明一個變數並對它設定為一個特定值後就不在改變它的值時,可以用下面的命令來保證一個變數的唯讀性:
readonly 變數名
在任何時候,建立的變數都只是當前Shell的局部變數,所以不能被Shell啟動並執行其他命令或Shell程式所利用,而export命令可以將一個局部變數提供給Shell執行的其他命令使用,其格式為:
export 變數名
也可以在給變數賦值的同時使用export命令:
export 變數名=變數值
使用export說明的變數,在Shell以後啟動並執行所有命令或程式中都可以訪問到。
(3)位置參數:
位置參數是一種在調用Shell程式的命令列中按照各自的位置決定的變數,是在程式名之後輸入的參數。位置參數之間用空格分隔,Shell取第一個位置參數替換程式檔案中的$1,第二個替換$2,依次類推。$0是一個特殊的變數,它的內容是當前這個Shell程式的檔案名稱,所以,$0不是一個位置參數,在顯示當前所有的位置參數時是不包括$0的。
(4)預定義變數:
預定義變數和環境變數相類似,也是在Shell一開始時就定義了的變數。所不同的是,使用者只能根據Shell的定義來使用這些變數,而不能重定義它。所有預定義變數都是由$符和另一個符號組成的,常用的Shell預定義變數有:
$# 位置參數的數量。
$* 所有位置參數的內容。
$? 命令執行後返回的狀態。
$$ 當前進程的進程號。
$! 後台啟動並執行最後一個進程號。
$0 當前執行的進程名。
其中,$?用於檢查上一個命令執行是否正確。(在Linux中,命令退出狀態為0表示該命令正確執行,任何非0值表示命令出錯。)
$$變數最常見的用途是用做暫存檔案的名字以保證暫存檔案不會重複。
(5)參數置換的變數:
Shell提供了參數置換功能以便使用者可以根據不同的條件來給變數賦不同的值。參數置換的變數有4種,這些變數通常與某一個位置參數相聯絡,根據指定的位置參數是否已經設定類決定變數的取值,它們的文法和功能分別如下。
a. 變數=${參數-word}:如果設定了參數,則用參數的值置換變數的值,否則用word置換。即這種變數的值等於某一個參數的值,如果該參數沒有設定,則變數就等於word的值。
b. 變數=${參數=word}:如果設定了參數,則用參數的值置換變數的值,否則把變數設定成word,然後再用word替換參數的值。注意,位置參數不能用於這種方式,因為在Shell程式中不能為位置參數賦值。
c. 變數=${參數?word}:如果設定了參數,則用參數的值置換變數的值,否則就顯示word並從Shell中退出,如果省略了word,則顯示標準資訊。這種變數要求一定等於某一個參數的值。如果該參數沒有設定,就顯示一個資訊,然後退出,因此這種方式常用於出錯指示。
d. 變數=${參數+word}:如果設定了參數,則用word置換變數,否則不進行置換。
所有這4種形式中的“參數”既可以是位置參數,也可以是另一個變數,只是用位置參數的情況比較多。