Linux的shell程式設計(二)(轉)

azz發表於2007-08-25
Linux的shell程式設計(二)(轉)[@more@]  3. shell程式設計(基礎部分)

  其實作為命令語言互動式地解釋和執行使用者輸入的命令只是shell功能的一個方面,shell還可以用來進行程式設計,它提供了定義變數和引數的手段以及豐富的程式控制結構。使用shell程式設計類似於DOS中的批處理檔案,稱為shell script,又叫shell程式或shell命令檔案。

  1.shell基本語法

  shell的基本語法主要就是如何輸入命令執行程式以及如何在程式之間透過shell的一些引數提供便利手段來進行通訊。

  (1)輸入輸出重定向

  在Linux中,每一個程式都有三個特殊的檔案描述指標:標準輸入(standard input,檔案描述指標為0)、標準輸出(standard output,檔案描述指標為1)、標準錯誤輸出(standard error,檔案描述指標為2)。這三個特殊的檔案描述指標使程式在一般情況下接收標準輸入終端的輸入,同時由標準終端來顯示輸出,Linux同時也向使用者提供可以使用普通的檔案或管道來取代這些標準輸入輸出裝置。在shell中,使用者可以利用“>”和“
  command>file:將命令的輸出結果重定向到一個檔案。

  command>&file:將命令的標準錯誤輸出一起重定向到一個檔案。

  command>>file:將標準輸出的結果追加到檔案中。

  command>>&file:將標準輸出和標準錯誤輸出的結構都追加到檔案中。

  command

  (2)管道pipe

  pipe同樣可以在標準輸入輸出和標準錯誤輸出間做代替工作,這樣一來,可以將某一個程式的輸出送到另一個程式的輸入,其語法如下:

  command1| command2[| command3...]

  也可以連同標準錯誤輸出一起送入管道:

  command1| &command2[|& command3...]

  (3)前臺和後臺

  在shell下面,一個新產生的程式可以透過用命令後面的符號“;”和“&”來分別以前臺和後臺的方式來執行,語法如下:

  command

  產生一個前臺的程式,下一個命令須等該命令執行結束後才能輸入。

  command &

  產生一個後臺的程式,此程式在後臺執行的同時,可以輸入其他的命令。

  2。shell程式的變數和引數

  像高階程式設計語言一樣,shell也提供說明和使用變數的功能。對shell來講,所有變數的取值都是一個字串,shell程式採用$var的形式來引用名為var的變數的值。

  Shell有以下幾種基本型別的變數:

  (1)shell定義的環境變數

  shell在開始執行時就已經定義了一些和系統的工作環境有關的變數,這些變數使用者還可以重新定義,常用的shell環境變數有:

  HOME:用於儲存註冊目錄的完全路徑名。

  PATH:用於儲存用冒號分隔的目錄路徑名,shell將按PATH變數中給出的順序搜尋這些目錄,找到的第一個與命令名稱一致的可執行檔案將被執行。

  TERM:終端的型別。

  UID:當前使用者的識別符號,取值是由數字構成的字串。

  PWD:當前工作目錄的絕對路徑名,該變數的取值隨cd命令的使用而變化。

  PS1:主提示符,在特權使用者下,預設的主提示符是“#”,在普通使用者下,預設的主提示符是“$”。

  PS2:在shell接收使用者輸入命令的過程中,如果使用者在輸入行的末尾輸入“”然後回車,或者當使用者按Enter鍵時shell判斷出使用者輸入的命令沒有結束時,顯示這個輔助提示符,提示使用者繼續輸入命令的其餘部分,預設的輔助提示符是“>”。

  (2)使用者定義的變數

  使用者可以按照下面的語法規則定義自己的變數:

  變數名=變數值

  要注意的一點是,在定義變數時,變數名前不應加符號“$”,在引用變數的內容時則應在變數名前加“$”;在給變數賦值時,等號兩邊一定不能留空格,若變數中本身就包含了空格,則整個字串都要用雙引號括起來。

  在編寫shell程式時,為了使變數名和命令名相區別,建議所有的變數名都用大寫字母來表示。

  有時我們想要在說明一個變數並對它設定為一個特定值後就不在改變它的值,這可以用下面的命令來保證一個變數的只讀性:

  readly 變數名

  在任何時候,建立的變數都只是當前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提供了引數置換能力以便使用者可以根據不同的條件來給變數賦不同的值。引數置換的變數有四種,這些變數通常與某一個位置引數相聯絡,根據指定的位置引數是否已經設定類決定變數的取值,它們的語法和功能分別如下。

  a. 變數=${引數-word}:如果設定了引數,則用引數的值置換變數的值,否則用word置換。即這種變數的值等於某一個引數的值,如果該引數沒有設定,則變數就等於word的值。

  b. 變數=${引數=word}:如果設定了引數,則用引數的值置換變數的值,否則把變數設定成word然後再用word替換引數的值。注意,位置引數不能用於這種方式,因為在shell程式中不能為位置引數賦值。

  c. 變數=${引數?word}:如果設定了引數,則用引數的值置換變數的值,否則就顯示word並從shell中退出,如果省略了word,則顯示標準資訊。這種變數要求一定等於某一個引數的值,如果該引數沒有設定,就顯示一個資訊,然後退出,因此這種方式常用於出錯指示。

  d. 變數=${引數+word}:如果設定了引數,則用word置換變數,否則不進行置換。

  所有這四種形式中的“引數”既可以是位置引數,也可以是另一個變數,只是用位置引數的情況比較多

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10901326/viewspace-965897/,如需轉載,請註明出處,否則將追究法律責任。

相關文章