Linux 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測試命令test命令用於檢查某個條件是否成立,它可以進行數值、字符和文件三個方面的測試,其測試符和相應的功能分別如下:

(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

條件爲假時的命令串

fi

3.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條件選擇爲用戶提供了根據字符串或變量的值從多個選項中選擇一項的方法,其格式如下:

casestring 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

{

若干命令行

}

調用函數的格式爲:

functionnameparam1 param2……

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

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


轉自:http://tech.cncms.com/develop/shell/52471.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章