(027) Linux之shell分支if语句
十年運維系列之基礎篇 - Linux
作者:曾林?
聯系:1494445739@qq.com
網站:www.jplatformx.com
版權:文章未經同意請勿轉載
?
一、使用if語句
通過shell,我們可以來寫出這樣的一個使用if語句的shell腳本片段。如下所示:
#!/bin/bash # test "if" statementx=5if [ $x = 5 ]; thenecho "x equals 5" elseecho "x doesn't equals 5" fi? ? ? 或者可以直接在命令行中輸入以上代碼(略有簡化),如下圖所示:
? ? ? if語句的語法格式如下:
if commands; thencommands [elif commands; thencommands] [elsecommands] 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" ]; thenif [ -f "$FILE" ]; thenecho "$FILE is a regular file."fi if [ -d "$FILE" ]; thenecho "$FILE is a directory."fi if [ -r "$FILE" ]; thenecho "$FILE is readable."fi if [ -w "$FILE" ]; thenecho "$FILE is writable."fi if [ -x "$FILE" ]; thenecho "$FILE is executable/searchable."fi elseecho "$FILE does not exist"exit 1 fiexit關于上面的腳本,需要注意兩個有趣的地方。首先,要注意$FILE在表達式內是如何被引用的。盡管引號不是必需的,但是這可以防范參數為空的情況。如果$FILE的參數擴展產生一個空值,將導致一個錯誤(操作符會被解釋為非空的字符串,而不是操作符)。用引號把參數括起來可以確保操作符后面總是跟隨一個字符串,即使字符串為空。其次,注意腳本末尾的exit命令。這個exit命令接受一個單獨的可選參數,它將稱為腳本的退出狀態。當不傳遞參數時,退出狀態默認為0。以這種方法使用exit命令,當$FILE擴展為一個不存在的文件名時,可以允許腳本提示失敗。這個exit命令出現在腳本的最后一行。這樣,當腳本執行到最后時,不管怎么樣,默認情況下它將以退出狀態0終止。
類似地,通過在return命令中包含一個整數參數,shell函數可以返回一個退出狀態。如果要將上面的腳本轉換為一個shell函數,從而能夠在一個更大的程序中使用,可以將exit命令替換為return命令,并得到想要的行為。
?
四、字符串表達式
下列表達式用來測試字符串的操作。
| 表達式 | 稱為true的條件 |
| string | string不為空 |
| -n string | string的長度大于0 |
| -z string | string的長度等于0 |
| string1 = string2 string1 == string2 | string1和string2相等。單等號和雙等號都可以使用,但是雙等號使用的更多。要注意在使用等號和不等于號的時候,需要操作符兩邊加空格。否則執行結果不是你想象 |
| string1 > string2 | 在排序時,string1在string2之后 |
| string1 < string2 | 在排序時,string1在string2之前 |
| string1 != string2 | string1和string2不相等 |
警告:在使用test命令時,“>”和“<”運算符必須用引號括起來(或者是使用反斜杠來進行轉義)。如果不這么做,就會被shell解釋為重定向操作符,從而造成潛在的破壞性結果。同時注意,盡管bash文檔中已經有過聲明,排序遵從當前語系的排列規則,但并非如此。在bash 4.0版本以前(包括4.0版本),使用的是ASCII(POSIX)排序方式。
?
五、整數表達式
下表中的表達式可以用于整數。
| 表達式 | 成為true的條件 |
| integer1 -eq integer2 | integer1和integer2相等 |
| integer1 -ne integer2 | integer1和integer2不相等 |
| integer1 -le integer2 | integer1小于等于integer2 |
| integer1 -lt integer2 | integer1小于integer2 |
| integer -gt integer2 | integer1大于integer2 |
| integer1 -ge integer2 | integer1大于等于integer2 |
?
六、更現代的test指令
bash提供了復合命令(()),而不是[](test指令)用來操作整數。該命令支持一套完整的算術計算。
復合指令(())用于執行算術真值測試(arithmetic truth test)。當算術計算的結果是非0值時,則算術真值測試為true。
? ? ? 以下是一個使用(())復合命令來測試算術結果的樣例腳本,注意這里使用了小于號、等于號和大于號來測試相等性。在處理整數的時候,這些語法看起來更加的自然。此外,由于(())復合命令只是shell語法的一部分,而非普通的命令,并且只能處理整數。
#!/bin/bash# compound command (()) for arithmetic computingINT=7if [ -z "$INT" ]; thenecho "INT is empty." >&2exit 1 elif (( $INT == 0 )); thenecho "INT equals zero." elif (( $INT < 0 )); thenecho "INT less than zero." elif (( $INT > 0)); thenecho "INT greater than zero." fiif (( $INT % 2 == 0)); thenecho "INT is even." elseecho "INT is odd." fi?
七、組合表達式
我們也可以將表達式組合起來,來創建更復雜的計算。表達式是使用邏輯運算符組合起來的。與test命令配套的邏輯運算符有三個,它們是and, or和not。下表展示了邏輯操作符。
| Operation | test | (()) |
| AND | -a | && |
| OR | -o | || |
| NOT | ! | ! |
?
八、控制運算符:另一種方式的分支
bash還提供了兩種可以執行分支的控制運算符。“&&”和“||”運算符與上述復合命令中的邏輯運算符類似,語法如下:
command1 && command2 和 command1 || command2
理解這兩個運算符是非常重要的。對于“&&”運算符來說,先執行command1,只有在command1執行成功時,command2才能夠執行。對于“||”運算符來說,先執行command1,則只有command1執行失敗的時候,command2才能夠執行。
? ? ? 從實用性考慮,這意味著可以這樣做:
mkdir test && cd test這會創建一個temp目錄,并且當這個創建工作執行成功后,當前的工作目錄才會更改為temp。只有在第一個mkdir命令執行成功后,才會嘗試執行第二個命令。同樣,看如下命令:
[ -d temp ] || mkdir temp這個命令先檢測temp目錄是否存在,只有當檢測失敗時,才會創建這個目錄。
?
轉載于:https://www.cnblogs.com/jplatformx/p/4344575.html
總結
以上是生活随笔為你收集整理的(027) Linux之shell分支if语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 4267 多维树状数组
- 下一篇: webapi get请求 FromUri