天天看點

linux shell if語句使用方法

原文位址:http://blog.chinaunix.net/uid-24607609-id-2118151.html

最精簡的 if 指令的文法是:

<code>if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi</code>

TEST-COMMAND 執行後且它的傳回狀态是0,那麼 CONSEQUENT-COMMANDS 就執行。傳回狀态是最後一個指令的退出狀态,或者當沒有條件是真的話為0。

TEST-COMMAND 經常包括數字和字元串的比較測試,但是也可以是任何在成功時傳回狀态0或者失敗時傳回一些其他狀态的一些指令。一進制表達式經常用于檢查檔案的狀态。如果對某個要素primaries, <code>FILE</code> 參數是 <code>/dev/fd/N</code> 這樣的形式,那麼就檢查檔案描述符 “N”。<code>stdin</code>, <code>stdout</code> 和 <code>stderr</code> 和他們各自的檔案描述符也可以用于測試。

下表包含了一個組成 TEST-COMMAND 指令或者指令清單,稱作 “要素primaries” 的概覽。這些primaries放置在方括号中來表示一個條件表達式的測試。

表 7.1. 主表達式

Primary

意義

[ <code>-a</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在則為真。

[ <code>-b</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且是一個塊特殊檔案則為真。

[ <code>-c</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且是一個字特殊檔案則為真。

[ <code>-d</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且是一個目錄則為真。

[ <code>-e</code> <code>FILE</code> ]

[ <code>-f</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且是一個普通檔案則為真。

[ <code>-g</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且已經設定了SGID則為真。

[ <code>-h</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且是一個符号連接配接則為真。

[ <code>-k</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且已經設定了粘制位則為真。

[ <code>-p</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且是一個名字管道(F如果O)則為真。

[ <code>-r</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且是可讀的則為真。

[ <code>-s</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且大小不為0則為真。

[ <code>-t</code> <code>FD</code> ]

如果檔案描述符 <code>FD</code> 打開且指向一個終端則為真。

[ <code>-u</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且設定了SUID (set user ID)則為真。

[ <code>-w</code> <code>FILE</code> ]

如果 <code>FILE</code> 如果 FILE 存在且是可寫的則為真。

[ <code>-x</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且是可執行的則為真。

[ <code>-O</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且屬有效使用者ID則為真。

[ <code>-G</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且屬有效使用者組則為真。

[ <code>-L</code> <code>FILE</code> ]

[ <code>-N</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在 and has been mod如果ied since it was last read則為真。

[ <code>-S</code> <code>FILE</code> ]

如果 <code>FILE</code> 存在且是一個套接字則為真。

[ <code>FILE1</code> <code>-nt</code> <code>FILE2</code> ]

如果 <code>FILE1</code> has been changed more recently than <code>FILE2</code>, or 如果 <code>FILE1</code><code>FILE2</code> does not則為真。 exists and

[ <code>FILE1</code> <code>-ot</code> <code>FILE2</code> ]

如果 <code>FILE1</code> 比 <code>FILE2</code> 要老, 或者 <code>FILE2</code> 存在且 <code>FILE1</code> 不存在則為真。

[ <code>FILE1</code> <code>-ef</code> <code>FILE2</code> ]

如果 <code>FILE1</code> 和 <code>FILE2</code> 指向相同的裝置和節點号則為真。

[ <code>-o</code> OPTIONNAME ]

如果 shell選項 “OPTIONNAME” 開啟則為真。

<code>[ -z</code> STRING ]

“STRING” 的長度為零則為真。

<code>[ -n</code> STRING ] or [ STRING ]

“STRING” 的長度為非零 non-zero則為真。

[ STRING1 == STRING2 ]

如果2個字元串相同。 “=” may be used instead of “==” for strict POSIX compliance則為真。

[ STRING1 != STRING2 ]

如果字元串不相等則為真。

[ STRING1 &lt; STRING2 ]

如果 “STRING1” sorts before “STRING2” lexicographically in the current locale則為真。

[ STRING1 &gt; STRING2 ]

如果 “STRING1” sorts after “STRING2” lexicographically in the current locale則為真。

[ ARG1 OP ARG2 ]

“OP” is one of <code>-eq</code>, <code>-ne</code>, <code>-lt</code>, <code>-le</code>, <code>-gt</code> or <code>-ge</code>. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

表達式可以借以下操作符組合起來,以降序列出:listed in decreasing order of precedence:

表 7.2. 組合表達式

操作

效果

[ ! EXPR ]

如果 EXPR 是false則為真。

[ ( EXPR ) ]

傳回 EXPR的值。這樣可以用來忽略正常的操作符優先級。

[ EXPR1 -a EXPR2 ]

如果 EXPR1 and EXPR2 全真則為真。

[ EXPR1 -o EXPR2 ]

如果 EXPR1 或者 EXPR2 為真則為真。

[ (或作 test) 内建指令對條件表達式使用一系列基于參數數量的規則來求值。更多關于這個主題的資訊可以在Bash文檔中查找。就像if 使用fi 來結束一樣,在條件列完之後必須用"&gt;"來結束。

CONSEQUENT-COMMANDS 列出了跟在 then 語句後面可以是任何有效的UNIX指令,任何可執行的程式,任何可執行的shell腳本或者任何shell語句,除了 fi. 。重要地記住 then 和 fi 在shell裡面被認為是分開的語句。是以,在指令行上使用的時候,他們用分号隔開。

在腳本中,if語句的不同部分通常是良好分隔的。以下是一些簡單的例子:

第一個例子檢查一個檔案是否存在:

加入到你的Bash配置檔案中去:

環境

以上的例子将在指令行輸入後開始工作:

然而,如果你使用依賴環境的測試,當你在腳本中輸入相同的指令你可能得到不用的結果,因為腳本會打開一個新的,沒有設定預期的變量和選項的shell。

<code>?</code> 變量包含了之前執行指令的退出狀态(最近完成的前台程序)。

以下的例子顯示了一個簡單的測試:

以下的例子證明了 TEST-COMMANDS 可以是任何有傳回和退出狀态的UNIX指令,之後 if 再次傳回零的退出狀态:

以下能得到同樣的結果:

以下的例子是用了數值的比較:

這個腳本在每個星期天由cron來執行。如果星期的數是偶數,他就提醒你把垃圾箱清理:

一個通過比較字元串來測試使用者ID的例子:

使用Bash,你可以縮短這樣的結構。下面是以上測試的精簡結構:

類似于如果測試為真就執行的 “&amp;&amp;” 表達式, “||” 指定了測試為假就執行。類似于 “&amp;&amp;” 表達式指明了在兩個測試條件為真時所采取的動作,“||” 指明測試為假時所采取的行動。

正規表達式也可以在比較中使用:

真正的程式員

多數程式員更喜歡使用和方括号相同作用的内建的 test 指令,像這樣:

參見資訊頁面得到更多關于Bash “(( EXPRESSION ))” 和 “[[ EXPRESSION ]]” 結構的子產品比對資訊。

<a href="http://www.blogjava.net/Jcat/archive/2008/04/13/192563.html">shell if 指令參數說明</a>

-b    當file存在并且是塊檔案時傳回真

-c    當file存在并且是字元檔案時傳回真

-d    當pathname存在并且是一個目錄時傳回真

-e    當pathname指定的檔案或目錄存在時傳回真

-f     當file存在并且是正規檔案時傳回真

-g     當由pathname指定的檔案或目錄存在并且設定了SGID位時傳回為真

-h     當file存在并且是符号連結檔案時傳回真,該選項在一些老系統上無效

-k     當由pathname指定的檔案或目錄存在并且設定了“粘滞”位時傳回真

-p     當file存在并且是指令管道時傳回為真

-r     當由pathname指定的檔案或目錄存在并且可讀時傳回為真

-s     當file存在檔案大小大于0時傳回真

-u     當由pathname指定的檔案或目錄存在并且設定了SUID位時傳回真

-w    當由pathname指定的檔案或目錄存在并且可執行時傳回真。一個目錄為了它的内容被通路必然是可執行的。

-o     當由pathname指定的檔案或目錄存在并且被子目前程序的有效使用者ID所指定的使用者擁有時傳回真。

比較字元寫法:

-eq    等于

-ne    不等于

-gt     大于

-lt    小于

-le     小于等于

-ge    大于等于

-z    空串

* =    兩個字元相等

* !=   兩個字元不等

* -n   非空串

繼續閱讀