Unix系列shell程式編寫2

2021-08-22 15:50:43 字數 4739 閱讀 8778

2>bsh裡特殊字元及其含義

在bsh中有一組非字母字元。這些字元的用途分為四類:作為特殊變數名、產生檔名、資料或程式控制以及引用和逃逸字元控制。他們 可以讓使用者在shell中使用最少的**完成複雜的任務。

*> shell變數名使用的特殊字元

$# 傳送給命令shell的引數序號

$- 在shell啟動或使用set命令時提供選項

$? 上一條命令執行後返回的值

$$ 當前shell的程序號

$! 上乙個子程序的程序號

$@ 所有的引數,每個都用雙括號括起

$* 所有引數,用雙括號括起

$n 位置引數值,n表示位置

$0 當前shell名

*>產生檔名的特殊字元

包括"*","?","",上面講過,不再多說。

*>資料或程式控制使用的特殊字元

>(file) 輸出重定向到檔案中(沒有檔案則建立,有則覆蓋)

>>(file) 輸出重定向到檔案中(沒有則建立,有則追加到檔案尾部)

; 命令分割符

| 管道符

& 後台執行(例如:sleep 10 &)

` ` 命令替換,重定向一條命令的輸出作為另一命令的引數

*>對於引用或逃逸的特殊字元

bsh用單引號' '和雙引號" "將特殊字元或由空白分隔的字引用起來組成乙個簡單的資料串.使用單引號和雙引號的區別是雙引號中的內容可進行引數和變數替換.逃逸字元也一樣.

$echo "$home $path"

結果顯示$/u/ice_walk/bin:/etc:/usr/bin

而$echo '$home $path' 結果顯示$home $path

shell的逃逸符是乙個"\",表示其後的字元不具有特殊的含義或不是shell的函式

$echo \$home $path

結果顯$$home /bin:/etc:/usr/bin:

3>bsh的變數

前面我們在多個地方引用了變數,當shell遇到乙個"$"符時(沒有被引用或逃逸),它將認為其後為一變數。不論該變數是環境變數還是使用者自定義的變數,在命令列中變數名要被變數值替換。例如命令:ls $home將列出變數home對應目錄下的檔案。使用者可以在命令列中的任何地方進行變數替換。包括命令名本身,例如:

$dir=ls

$$dir f*

將列出以f開頭的檔案。

現在詳細的介紹下bsh的變數。bsh中有四類變數:使用者定義的變數、位置變數(shell引數)、預定義變數及環境變數。

使用者定義的變數:

使用者定義的變數由字母和下劃線組成,並且變數名的第乙個字元不能為數字(0~9)。與其他unix名字一樣,變數名是大小寫敏感的。使用者可以在命令列上用"="給變數賦值,例如:

$name=ice_walk

給變數name賦值為ice_walk,在應用變數name的時候,在name前加"$"即可,前面已說,不再廢話(別說我廢話多,關鍵是沒當過老師

$sun=sun

$echo $day

在應用shell變數時候,可以在變數名字兩邊$後面加上{},以更加清楚的顯示給shell,哪個是真正的變數,以實現字串的合併等功能。

結果顯示:sunday(注意不能echo $sunday,因為sunday變數沒定義,讀者試下執行結果) 使用者也可以在命令列上同時對多個變數賦值,賦值語句之間用空格分開:

$x=x y=y

注意變數賦值是從右到左進行的

$x=$y y=y

x的值是y

$x=z y=$z

y的值是空(變數未賦值時,shell不報錯,而是賦值為空)

使用者可以使用"unset 《變數》"命令清除給變數賦的值

使用者使用變數時要在其前面加一"$"符,使變數名被變數值所替換。bsh可以進行變數的條件替換,即只有某種條件發生時才進行替換。替換條件放在一對大括號{}中,如:

$ variable是一變數值,value是變數替換使用的預設值

$echo hello $uname

結果顯示:hello

$echo hello $

結果顯示:hello there

$echo $uname

結果顯示: (空)

$uname=john

$echo hello $

結果顯示:hello john

可以看出,變數替換時將使用命令列中定義的預設值,但變數的值並沒有因此而改變。另外一種替換的方法是不但使用預設值進行替換,而且將預設值賦給該變數。其形式如下:

$該形式在變數替換後同時把值value符給變數variable。

$echo hello $uname

結果顯示:hello

$echo hello $

結果顯示:hello there

$echo $uname

結果顯示:there

$uname=john

$echo hello $

結果顯示:hello john

變數替換的值也可以是` `括起來的命令:

$userdir=

第三種變數的替換方法是只有當變數已賦值時才用指定值替換形式:

$只有變數variable已賦值時,其值才用value替換,否則不進行任何替換,例如:

$erropt=a

$echo $

結果顯示:error tracking is acitive

$erropt=

$echo $

結果顯示: (空)

我們還可以使用錯誤檢查的條件進行變數替換:

$當變數variable已設定時,正常替換。否則訊息message將送到標準錯誤輸出(若此替換出現在shell程式中,那麼該程式將終止)。 例如:

$uname=

$echo $

結果顯示:uname has not been set

$uname=stephanie

$echo $

結果顯示:stephanie

當沒有指定message時,shell將顯示一條預設的訊息,例如:

$uname=

$echo $

結果顯示:sh:uname:parameter null or not set

4>位置變數或shell引數

在shell解釋使用者的命令時,將把命令列的第乙個字作為命令,而其他的字作為引數。當命令對應的可執行檔案為shell程式時,這些引數將作為位置變數傳送給該程式。第乙個引數記為$1,第二個為$2....第九個為$9。其中1到9是真正的引數名,"$"符只是用來標識變數的替換。

位置變數$0指命令對應的可執行檔名。在後面將詳細介紹位置變數。

1.唯讀變數

使用者將變數賦值後,為了防止以後對該變數的修改,可以用以下命令將該變數設定為唯讀變數:

readonly variable

2.export命令

shell執行乙個程式時,首先為該程式建立乙個新的執行環境,稱為子shell。在bourneshell中變數都是區域性的,即他們只在建立他們的shell中有意義。使用者可以用export命令讓變數被其他子shell識別。但某使用者的變數是沒法讓其他使用者使用的。

當使用者啟動乙個新shell時,該shell將使用預設的提示符。因為賦給變數ps1的值只在當前shell中有效。為了讓子shell使用當前shell中定義的提示符號,可以使用export命令:

$ps1="enter command:"

enter command:export ps1

enter command:sh

enter command:

此時變數ps1變成了全域性變數。它可以被其子shell使用。當變數被設定成全域性的以後,將一直保持有效直到使用者退出該變數所在的shell。使用者可以在檔案.profile中給乙個變數永久賦值。詳見"規範shell"。

基本語句

從本節起,我們將詳細介紹shell程式設計的基本知識,通過編寫shell指令碼,使用者可以根據自己的需要有條件的或者重複的執行命令。通過shell程式,可以把單個的unix命令組合成乙個完全實用的工具,完成使用者的任務。

1>什麼是shell程式

當使用者在unix shell中輸入了一條複雜的命令,如:

$ls -r /|greo myname |pg

我們可以稱使用者在對shell程式設計,當把這條語句寫在乙個檔案裡,並且符給該檔案可執行許可權,那麼該檔案就是我們傳統上說的shell程式。

2>簡單的shell程式

假設使用者每天使用下述命令備份自己的資料檔案:

$cd /usr/icewalk;ls * |cpio -o > /dev/fd0

我們可以把它寫在乙個檔案,如:ba.sh中:

$cat >ba.sh

cd /usr/icewalk

ls * |cpio -o > /dev/fd0

^d  (ctrl_d)

程式ba.sh就是shell指令碼,使用者可以用vi或其他編輯工具編寫更複雜的指令碼。

此時使用者備份檔案只需要執行shell程式ba.sh,執行時需在當前shell中建立乙個子shell:

$sh ba.sh

程式sh與使用者登陸時執行的bourne shell相同,但當sh命令帶引數ba.sh後,它將不再是乙個互動式的shell,而是直接從檔案ba.sh中讀取命令。

執行ba.sh中命令的另一方法是給檔案ba.sh執行許可權:

$chmod +x ba.sh

此時,使用者可以輸入檔名ba.sh做為乙個命令來備份自己的資料,需要注意的是,用這種方法執行命令的時候,檔案ba.sh必須存在於環境變數$path所指定的路徑上

Unix系列shell程式編寫6

與或結構 使用與 或結構有條件的執行命令 shell程式中可以使用多種不同的方法完成相同的功能,例如until和while語句就可以完成相同的功能,同樣,除了if then else結構可以使命令有條件的執行外,和 操作符也能完成上述功能。在c語言中這兩個操作符分別表示邏輯與和邏輯或操作。在bour...

Shell程式編寫

利用case 迴圈等結構,顯示命令選單,實現掛載 解除安裝 檔案拷貝 目錄顯示 檔案資訊顯示等子程式 這些功能分別使用函式和shell程式進行定義,然後呼叫 指令碼如下,有問題可以問我,有幫助的話多點贊 bin bash echo menu echo 1 mount echo 2 umount ec...

編寫一unix程式,防止殭屍程序的出現

殭屍程序的避免 父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起。如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後,父程序會收到該訊號,可以在handler中呼叫wait 如果 父程序不關心子程序什麼時候結束,那麼可以用sign...