標籤:
十年營運系列之基礎篇 - 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。
- 檔案運算式(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語句