Linux的Shell編程(1)

來源:互聯網
上載者:User

其實作為命令語言互動式地解釋和執行使用者輸入的命令只是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種形式中的“參數”既可以是位置參數,也可以是另一個變數,只是用位置參數的情況比較多。

Shell程式設計的流程式控制制

和其他進階程式設計語言一樣,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。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.