天天看點

SHELL test 指令用法

原文位址:http://www.examw.com/linux/all/114976/index.html

功能:檢查檔案和比較值

  1)判斷表達式

  if test  (表達式為真)

  if test !表達式為假

  test 表達式1 –a 表達式2                  兩個表達式都為真

  test 表達式1 –o 表達式2                 兩個表達式有一個為真

  2)判斷字元串

  test –n 字元串                                   字元串的長度非零

  test –z 字元串                                    字元串的長度為零

  test 字元串1=字元串2                    字元串相等

  test 字元串1!=字元串2               字元串不等

  3)判斷整數

  test 整數1 –eq 整數2                        整數相等

  test 整數1 –ge 整數2                        整數1大于等于整數2

  test 整數1 –gt 整數2                         整數1大于整數2

  test 整數1 –le 整數2                         整數1小于等于整數2

  test 整數1 –lt 整數2                          整數1小于整數2

  test 整數1 –ne 整數2                        整數1不等于整數2

  4)判斷檔案

  test  File1 –ef  File2        兩個檔案具有同樣的裝置号和i結點号

  test  File1 –nt  File2        檔案1比檔案2 新

  test  File1 –ot  File2        檔案1比檔案2 舊

  test –b File        檔案存在并且是塊裝置檔案

  test –c File        檔案存在并且是字元裝置檔案

  test –d File        檔案存在并且是目錄

  test –e File        檔案存在

  test –f File         檔案存在并且是正規檔案

  test –g File        檔案存在并且是設定了組ID

  test –G File        檔案存在并且屬于有效組ID

  test –h File        檔案存在并且是一個符号連結(同-L)

  test –k File        檔案存在并且設定了sticky位

  test –b File        檔案存在并且是塊裝置檔案

  test –L File        檔案存在并且是一個符号連結(同-h)

  test –o File        檔案存在并且屬于有效使用者ID

  test –p File        檔案存在并且是一個命名管道

  test –r File        檔案存在并且可讀

  test –s File        檔案存在并且是一個套接字

  test –t FD        檔案描述符是在一個終端打開的

  test –u File        檔案存在并且設定了它的set-user-id位

  test –w File        檔案存在并且可寫

  test –x File        檔案存在并且可執行

  每一種條件語句的基礎都是判斷什麼是真什麼是假。是否了解其工作原理将決定您編寫的是品質一般的腳本還是您将引以為榮的腳本。

  Shell 腳本的能力時常被低估,但實際上其能力的發揮受制于腳本撰寫者的能力。您了解得越多,您就越能像變戲法似地撰寫一個檔案來使任務自動化和簡化您的管理工作。

  在 shell 腳本中進行的每一種操作(除最簡單的指令編組之外)都需要檢查條件。所有的 shell 腳本“邏輯” — 廣義意義下的“邏輯” — 通常都可以分為以下三大類:

if {condition exists} then ...

  while {condition exists} do ...

  until {condition exists} do ...

  無論随後的操作是什麼,這些基于邏輯的指令都依靠判斷一種條件是否真實存在來決定後續的操作。test 指令是使得在每一種情況下都能夠确定要判斷的條件是否存在的實用工具。是以,徹底了解這個指令對于撰寫成功的 shell 腳本至關重要。

  工作原理

  test 指令最短的定義可能是評估一個表達式;如果條件為真,則傳回一個 0 值。如果表達式不為真,則傳回一個大于 0 的值 — 也可以将其稱為假值。檢查最後所執行指令的狀态的最簡便方法是使用 $? 值。出于示範的目的,本文中的例子全部使用了這個參數。

  test 指令期望在指令行中找到一個參數,當 shell 沒有為變量指派時,則将該變量視為空。這意味着在處理腳本時,一旦腳本尋找的參數不存在,則 test 将報告該錯誤。

  當試圖保護腳本時,您可以通過将所有參數包含在雙引号中來解決這個問題。然後 shell 将變量展開,如果變量沒有值,那麼将傳遞一個空值給 test。另一種方法是在腳本内增加一個額外檢查過程來判斷是否設定了指令行參數。如果沒有設定指令行參數,那麼腳本會告訴使用者缺少參數,然後退出。我們 會通過一些例子來更具體地說明所有這些内容。

  test 和 [ 指令

  雖然 Linux 和 UNIX 的每個版本中都包含 test 指令,但該指令有一個更常用的别名 — 左方括号:[。test 及其别名通常都可以在 /usr/bin 或 /bin (取決于作業系統版本和供應商)中找到。

  當您使用左方括号而非 test 時,其後必須始終跟着一個空格、要評估的條件、一個空格和右方括号。右方括号不是任何東西的别名,而是表示所需評估參數的結束。條件兩邊的空格是必需的,這表示要調用 test,以差別于同樣經常使用方括号的字元/模式比對操作。

  test 和 [ 的文法如下:

  test expression

  [ expression ]

  在這兩種情況下,test 都評估一個表達式,然後傳回真或假。如果它和 if、while 或 until 指令結合使用,則您可以對程式流進行廣泛的控制。不過,您無需将 test 指令與任何其它結構一起使用;您可以從指令行直接運作它來檢查幾乎任何東西的狀态。

  因為它們彼此互為别名,是以使用 test 或 [ 均需要一個表達式。表達式一般是文本、數字或檔案和目錄屬性的比較,并且可以包含變量、常量和運算符。運算符可以是字元串運算符、整數運算符、檔案運算符或布爾運算符 — 我們将在以下各部分依次介紹每一種運算符。

  test 檔案運算符

  利用這些運算符,您可以在程式中根據對檔案類型的評估結果執行不同的操作:

  -b file 如果檔案為一個塊特殊檔案,則為真

  -c file 如果檔案為一個字元特殊檔案,則為真

  -d file 如果檔案為一個目錄,則為真

  -e file 如果檔案存在,則為真

  -f file 如果檔案為一個普通檔案,則為真

  -g file 如果設定了檔案的 SGID 位,則為真

  -G file 如果檔案存在且歸該組所有,則為真

  -k file 如果設定了檔案的粘着位,則為真

  -O file 如果檔案存在并且歸該使用者所有,則為真

  -p file 如果檔案為一個命名管道,則為真

  -r file 如果檔案可讀,則為真

  -s file 如果檔案的長度不為零,則為真

  -S file 如果檔案為一個套接字特殊檔案,則為真

  -t fd 如果 fd 是一個與終端相連的打開的檔案描述符(fd 預設為 1),則為真

  -u file 如果設定了檔案的 SUID 位,則為真

  -w file 如果檔案可寫,則為真

  -x file 如果檔案可執行,則為真

SHELL test [指令用法(二)  

2011-10-24 20:23:52|  分類:速記|  标簽:|字号大中小 訂閱

原文位址:http://www.examw.com/linux/all/114977/index.html

以下示例顯示了此簡單操作的運作情況:

  $ ls -l

  total 33

  drwxr-xr-w 2 root root 1024 Dec 5 05:05 LST

  -rw-rw-rw- 1 emmett users 27360 Feb 6 07:30 evan

  -rwsrwsrwx 1 root root 152 Feb 6 07:32 hannah

  drwxr-xr-x 2 emmett users 1024 Feb 6 07:31 karen

  -rw------- 1 emmett users 152 Feb 6 07:29 kristin

  -rw-r--r-- 1 emmett users 152 Feb 6 07:29 spencer

  $

  $ test -r evan

  $ echo $?

  0

  $ test -r walter

  $ echo $?

  1

  $

  由于第一次評估為真 — 檔案存在且可讀 — 傳回值為真,或 0。由于第二次評估的檔案不存在,該值為假,傳回值不為零。将值指定為零或非零很重要,因為在失敗時不會始終傳回 1(雖然這是通常傳回的值),可能傳回一個非零值。

  正如開頭所提到的,除了使用 test 外,您還可以用方括号 [ ] 将指令包覆來向 shell 發出同樣的指令 — 如下所示:

  $ [ -w evan ]

  $ echo $?

  0

  $ [ -x evan ]

  $ echo $?

  1

  $

  同樣,第一個表達式為真,第二個表達式為假 — 正如傳回值所訓示的那樣。您還可以使用以下指令将兩個檔案彼此進行比較:

  file1 -ef file2 測試以判斷兩個檔案是否與同一個裝置相連,是否擁有相同的 inode 編号

  file1 -nt file2 測試以判斷第一個檔案是否比第二個檔案更新(由修改日期決定)

  file1 -ot file2 測試以判斷第一個檔案是否比第二個檔案更舊

  以下示例顯示了使用這些運算符比較檔案的結果:

  $ [ evan -nt spencer ]

  $ echo $?

  0

  $ [ karen -ot spencer ]

  $ echo $?

  1

  $

  名為 evan 的檔案比名為 spencer 的檔案更新,因而評估為真。類似地,名為 karen 的檔案比名為 spencer 的檔案更新,是以該評估為假。

  字元串比較運算符

  如标題所示,這組函數比較字元串的值。您可以檢查它們是否存在、是否相同或者是否不同。

  String 測試以判斷字元串是否不為空

  -n string 測試以判斷字元串是否不為空;字元串必須為 test 所識别

  -z string 測試以判斷字元串是否為空;字元串必須為 test 所識别

  string1 = string2 測試以判斷 string1 是否與 string2 相同

  string1 != string2 測試以判斷 string1 是否與 string2 不同

  對任何變量進行的最有用的測試之一是判斷它的值是否不為空,可以簡單地将其放在 test 指令行中執行這種測試,如下例所示:

  $ test "$variable"

  強烈建議進行此種測試時用雙引号将變量包覆,以讓 shell 識别變量(即使變量為空)。預設情況下執行的基本字元串評估和 -n 測試從功能上講是相同的,如以下示例所示:

  #example1

  if test -n "$1"

  then

  echo "$1"

  fi

  執行以上例子中的代碼将根據 $1 是否存在給出以下結果:

  $ example1 friday

  friday

  $

  $ example1

  $

  如果将代碼更改為以下形式,則結果将相同:

  #example2

  if test "$1"

  then

  echo "$1"

  fi

  如下所示:

  $ example2 friday

  friday

  $

  $ example2

  $

  所有這些表明,通常不需要 -n,它代表預設操作。

  要從一個不同的角度來檢視各種可能性,您可以用另一個選項來替換 -n,并檢查該值是否為空(相對于非空)。這可以用 -z 選項來實作,代碼為:

  #example3

  if test -z "$1"

  then

  echo "no values were specified"

  fi

  運作如下:

  $ example3

  no values were specified

  $ example3 friday

  $

  如果在沒有指令行參數的情況下運作該程式,而表達式評估為真,那麼将執行程式塊中的文本。如果在指令行中有值,則腳本退出,不執行任何操作。将評估操作放在腳本的開頭非常有用,這可以在可能産生錯誤的進一步處理之前預先檢查變量值