Unix系列shell程式編寫6

2021-08-22 15:50:43 字數 2959 閱讀 8900

與或結構

使用與/或結構有條件的執行命令

shell程式中可以使用多種不同的方法完成相同的功能,例如until和while語句就可以完成相同的功能,同樣,除了if-then-else結構可以使命令有條件的執行外,$$和||操作符也能完成上述功能。在c語言中這兩個操作符分別表示邏輯與和邏輯或操作。在bourneshell中,用&&連線兩條命令的含義只有前面一條命令成功執行了,後面的命令才會執行。

&&操作的形式為:

command && command

例如語句:

rm $tempdir/* && echo "files successfully removed"

只有rm命令成功執行以後,才會執行echo命令。若用if-then語句實現上述功能,形式為:

if rm $tempdir/*

then

echo "files successfully removed"

fi相反,用||連線兩條命令的含義為只有第一條命令執行失敗才執行第二條命令,例如:

rm $tempdir/* || echo "file were not removed"

上面語句的等價形式為:

if rm $tempdir/*

then

:else

echo "files were not removed"

fi這兩種操作符可以聯合使用,如在下面的命令列中,只有command1和command2執行成功後,command3才會執行:

command1 && command2 && command3

下面的命令列表示只有command1成功執行,command2不成功執行時,才會執行command3。

&&和||操作符可以簡化命令條件執行的格式,但一般只用於一條命令的條件執行。如果許多命令都使用這兩個操作符,那麼整個程式的可讀性將變的很差,所以在多條命令的條件執行時,最好採用可讀性好的if語句。

函式現在我們介紹shell程式中的函式部分,基本上任何高階語言都支援函式這個東西,能讓我們勝好多事情的東西,至少省的頻繁的敲擊相同的東西,好了come on

shell程式中的函式

函式又叫做子程式,可以在程式中的任何地方被呼叫,其格式如下:

函式名字()

shell程式的任何地方都可以用命令 "函式名字" 呼叫,使用函式的好處有兩點,一點是使用函式可以把乙個複雜的程式化為多個模組,易於管理,符合結構化程式的設計思想,另乙個好處是**的重用。

shell函式和shel程式比較相似,它們的區別在於shell程式在子shell中執行,而shell函式在當前shell中執行。因此,在當前shell中可以看到shell函式對變數的修改。在任何shell中都可以定義函式,包括互動式shell。

例如:$dir()

結果是我們在$後面打dir,其顯示結果同ls -l的作用是相同的。該dir函式將一直保留到使用者從系統退出,或執行了如下所示的unset命令:

$unset dir

下面的例子說明了函式還可以接受位置引數:

$dir()

執行 dir a* 看產生什麼結果

引數a*傳遞到dir函式中並且代替了$*

通常shell程式將在子shell中執行,該程式對變數的改變只在子shell中有效而在當前shell中無效。"."命令可以使shell程式在當前shell中執行。使用者可以在當前shell中定義函式和對變數賦值。通常用下面命令來重新初使化.profile對shell環境的設定。

$ . .profile

由於看到這部分相對簡單,我們還是順便說說trap好了

使用trap命令進行例外處理

使用者編寫程式在程式執行時可能會發生一些例外情況,比如執行該程式的使用者按中斷鍵或使用kill命令,或者控制終端突然與系統斷開等。unix系統中的上述情況會使系統向程序發乙個訊號,通常情況下該訊號使程序終止執行。有時侯使用者希望程序在接到終止訊號時進行一些特殊的操作。若程序在執行時產生一些臨時檔案,又因接受到的訊號而終止。那麼該程序產生的臨時檔案將保留下來。在bsh中,使用者可以使用trap命令修改程序接收到終止訊號時進行的預設操作。

trap命令格式如下:

trap command_string signals

多數系統中共有15種發給程序的訊號,預設情況下大多數訊號都會使程式終止。使用者最好查閱自己系統的文擋,看看本系統內使用的訊號種類。除了訊號為9(真正的kill訊號)不能使用trap命令外,其他訊號所帶來的操作都可以用trap命令進行指定。下面是trap命令中經常使用的幾種訊號:

訊號   功能

1     掛起

2    操作中斷

15    軟終止(kill訊號)

若命令串中包含不只一條命令,必須使用引號將整個命令括起來,具體是單引號還是雙引號,由使用者是否需要變數替換決定。" "替換,' '不替換。

使用下面trap命令可以使程式在接收到掛起、中斷或kill訊號時,首先把臨時檔案刪除,然後退出:

trap "rm $tempdir/* $$;exit" 1 2 15

在上面例子中,當shell讀取trap命令時,首先對$tempdir和$$進行變數替換,替換之後的命令串將被儲存在trap表中,若上例中trap命令使用單引號時,trap命令執行時候,不進行變數替換,而把命令串 rm $tempdir/*$$;exit 放到trap表中,當檢測到訊號時,程式解釋執行trap表中的命令串,此時進行變數替換。前面變數$tempdir和$$的值為執行trap指令時候的值,後一種情況中變數的值為程式接收到訊號時候的值,所以 "、'一定要區分仔細。

下面命令的含義為使用者按二次中斷鍵後,程式才終止:

trap 'trap 2' 2

一般trap命令中的命令串中幾乎都包含exit語句,上面rm的例子若無exit語句,接收到訊號rm命令執行完後程式將掛起。但有時使用者也需要程式在接到訊號後掛起,例如當終端和系統斷開後,使用者發出掛起訊號,並執行空命令,如下:

trap : 1

若使用者想取消前trap指令設定的命令串,可以再執行trap命令,在命令中不指定命令串表示接收到訊號後進行預設的操作,命令如下:

trap 1

Unix系列shell程式編寫2

2 bsh裡特殊字元及其含義 在bsh中有一組非字母字元。這些字元的用途分為四類 作為特殊變數名 產生檔名 資料或程式控制以及引用和逃逸字元控制。他們 可以讓使用者在shell中使用最少的 完成複雜的任務。shell變數名使用的特殊字元 傳送給命令shell的引數序號 在shell啟動或使用set命...

Shell程式編寫

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

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

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