(027) Linux之shell分支if語句

來源:互聯網
上載者:User

標籤:

十年營運系列之基礎篇 - Linux

曾林 

聯絡:[email protected]

網站:www.jplatformx.com

著作權:文章未經同意請勿轉載

一、使用if語句

通過shell,我們可以來寫出這樣的一個使用if語句的shell指令碼片段。如下所示:

#!/bin/bash# test "if" statementx=5if [ $x = 5 ]; then    echo "x equals 5"else    echo "x doesn‘t equals 5"fi

      或者可以直接在命令列中輸入以上代碼(略有簡化),如所示:

      if語句的文法格式如下:

if commands; then    commands[elif commands; then    commands][else    commands]if

      在這個文法格式中,“command”可以是一組命令。乍看上去可能會有些迷惑。在去除這個迷惑之前,我們必須要先瞭解一下shell如何判斷一個命令的成功與失敗。

 

二、退出狀態

  命令(包括我們編寫的shell指令碼和shell函數)在執行完畢後,會向作業系統發送一個值,稱之為“退出狀態”。這個值是一個0~255的整數,用來指示命令執行成功還是失敗。按照慣例,數值0表示執行成功,其他的數值表示執行失敗。shell提供了一個可以用來檢測退出狀態的參數。這個參數就是$?。如所示:

  在這個例子中,我們兩次執行了ls命令。第一次,命令執行成功,如果顯示參數“$?”的值,可以看到值是0.第二次執行ls命令時,產生了一個錯誤,再次顯示“$?”的值,這次值是2,表示這個命令遇到了一個錯誤。有些命令使用不同的退出值來診斷錯誤,而需要命令執行失敗時,只是簡單地退出並發送數字1.man手冊中經常會包括一個標題為“Exit Status”的段落,它描述使用的代碼。數字0總是表示執行成功。

  shell提供了2個非常簡單的內建命令,它們不做任何事情,除了以一個0或1退出狀態來終止執行。“true”命令總是表示執行成功,而“false”命令總是表示執行失敗。如所示:

  我們可以用這兩個命令來查看if語句是如何工作的。if語句真正做的事情是評估命令的成功或失敗。

  當在if後面的命令執行成功時,命令echo "it‘s true."會被執行,而當在if後面的命令執行失敗時,該命令則不執行。如果在if後面有一系列的命令,那麼則根據最後一個命令的執行結果來進行評估。如所示:

 

三、使用test命令

  目前為止,經常和if一起使用的命令是test。test命令會執行各種檢查和比較。這個命令有兩種等價的形式:

  test expression

  以及更加流行的

  [ expression ]

  這裡的expression是一個運算式,其結果是true或false。當這個運算式為true時,test命令會返回一個0退出狀態;當運算式為false時,test命令的退出狀態為1。

  1. 檔案運算式(expression)

  下表中的運算式展示的是有關檔案的運算式。這些檔案運算式用來評估檔案的狀態。

檔案運算式 成為true的條件
file1 -ef file2 file1和file2擁有相同的資訊節點編號(這兩個檔案通過永久連結指向同一個檔案)
file1 -nt file2 file1比file2新
file1 -ot file2 file1比file2舊
-b file file存在並且是一個塊(裝置)檔案
-c file file存在並且是一個字元(裝置)檔案
-d file file存在並且是一個目錄
-e file file存在
-f file file存在並且是一個普通檔案
-g file file存在並且設定了組ID
-G file file存在並且屬於有效組ID
-k file file存在並且有“粘滯位(sticky bit)屬性”
-L file file存在並且是一個符號連結
-O file file存在並且屬於有效使用者ID
-p file file存在並且是一個具名管道
-r file file存在並且可讀(有效使用者有可讀許可權)
-s file file存在並且其長度大於0
-S file file存在並且是一個網路通訊端
-t fd fd是一個定向到終端/從終端定向的檔案描述符,可以用來確定標準輸入/輸出/錯誤是否被重新導向
-u file file存在並且設定了setuid位
-w file file存在並且可寫(有效使用者擁有可寫入權限)
-x file file存在並且可執行(有效使用者擁有執行/搜尋許可權)

  下面代碼展示了一個使用檔案運算式的例子:

#!/bin/bash# test-file: Evaluate the status of a fileFILE=~/.bashrcif [ -e "$FILE" ]; then    if [ -f "$FILE" ]; then        echo "$FILE is a regular file."    fi      if [ -d "$FILE" ]; then        echo "$FILE is a directory."    fi      if [ -r "$FILE" ]; then        echo "$FILE is readable."    fi      if [ -w "$FILE" ]; then        echo "$FILE is writable."    fi      if [ -x "$FILE" ]; then        echo "$FILE is executable/searchable."    fi  else    echo "$FILE does not exist"    exit 1fiexit

  關於上面的指令碼,需要注意兩個有趣的地方。首先,要注意$FILE在運算式內是如何被引用的。儘管引號不是必需的,但是這可以防範參數為空白的情況。如果$FILE的參數擴充產生一個空值,將導致一個錯誤(操作符會被解釋為非空的字串,而不是操作符)。用引號把參數括起來可以確保操作符後面總是跟隨一個字串,即使字串為空白。其次,注意指令碼末尾的exit命令。這個exit命令接受一個單獨的選擇性參數,它將稱為指令碼的退出狀態。當不傳遞參數時,退出狀態預設為0。以這種方法使用exit命令,當$FILE擴充為一個不存在的檔案名稱時,可以允許指令碼提示失敗。這個exit命令出現在指令碼的最後一行。這樣,當指令碼執行到最後時,不管怎麼樣,預設情況下它將以退出狀態0終止。

  類似地,通過在return命令中包含一個整數參數,shell函數可以返回一個退出狀態。如果要將上面的指令碼轉換為一個shell函數,從而能夠在一個更大的程式中使用,可以將exit命令替換為return命令,並得到想要的行為。

 

(027) Linux之shell分支if語句

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.