test命令
Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值、字符和文件三個方面的測試。
語法:test EXPRESSION 或者 [ EXPRESSION ]
字符串判斷(用於看用戶有沒有輸入指定的變量 指定用戶輸入目錄 如沒填)
-n 字符段長度是否非零的 如果結果為真值 返回值為0 如果結果為假值返回值非0
數值測試
| 參數 | 說明 |
|---|---|
| -eq | 等於則為真 |
| -ne | 不等於則為真 |
| -gt | 大於則為真 |
| -ge | 大於等於則為真 |
| -lt | 小於則為真 |
| -le | 小於等於則為真 |
實例演示:
num1=100 num2=100 if test $[num1] -eq $[num2] then echo '兩個數相等!' else echo '兩個數不相等!' fi
輸出結果:
兩個數相等!
代碼中的 [ ] 執行基本的算數運算,如:
#!/bin/bash a=5 b=6 result=$[a+b] # 注意等號兩邊不能有空格 echo "result 為: $result"
結果為:
result 為: 11
字符串測試
| 參數 | 說明 |
|---|---|
| = | 等於則為真 |
| != | 不相等則為真 |
| -z 字符串 | 字符串的長度為零則為真 |
| -n 字符串 | 字符串的長度不為零則為真 |
實例演示:
num1="ru1noob" num2="runoob" if test $num1 = $num2 then echo '兩個字符串相等!' else echo '兩個字符串不相等!' fi
輸出結果:
兩個字符串不相等!
文件測試
| 參數 | 說明 |
|---|---|
| -e 文件名 | 如果文件存在則為真 |
| -r 文件名 | 如果文件存在且可讀則為真 |
| -w 文件名 | 如果文件存在且可寫則為真 |
| -x 文件名 | 如果文件存在且可執行則為真 |
| -s 文件名 | 如果文件存在且至少有一個字符則為真 |
| -d 文件名 | 如果文件存在且為目錄則為真 |
| -f 文件名 | 如果文件存在且為普通文件則為真 |
| -c 文件名 | 如果文件存在且為字符型特殊文件則為真 |
| -b 文件名 | 如果文件存在且為塊特殊文件則為真 |
實例演示:
cd /bin if test -e ./bash then echo '文件已存在!' else echo '文件不存在!' fi
輸出結果:
文件已存在!
另外,Shell還提供了與( -a )、或( -o )、非( ! )三個邏輯操作符用於將測試條件連接起來,其優先級為:"!"最高,"-a"次之,"-o"最低。例如:
cd /bin if test -e ./notFile -o -e ./bash then echo '至少有一個文件存在!' else echo '兩個文件都不存在' fi
條件判斷語句
1、基本語法:
if [ command ]; then 符合該條件執行的語句 fi
2、擴展語法:
if [ command ];then 符合該條件執行的語句 elif [ command ];then 符合該條件執行的語句 else 符合該條件執行的語句 fi
3、語法說明:
bash shell會按順序執行if語句,如果command執行后且它的返回狀態是0,則會執行符合該條件執行的語句,否則后面的命令不執行,跳到下一條命令。
當有多個嵌套時,只有第一個返回0退出狀態的命令會導致符合該條件執行的語句部分被執行,如果所有的語句的執行狀態都不為0,則執行else中語句。
返回狀態:最后一個命令的退出狀態,或者當沒有條件是真的話為0。
常用參數:
文件/目錄判斷:
常用的: [ -a FILE ] 如果 FILE 存在則為真。 [ -d FILE ] 如果 FILE 存在且是一個目錄則返回為真。 [ -e FILE ] 如果 指定的文件或目錄存在時返回為真。 [ -f FILE ] 如果 FILE 存在且是一個普通文件則返回為真。 [ -r FILE ] 如果 FILE 存在且是可讀的則返回為真。 [ -w FILE ] 如果 FILE 存在且是可寫的則返回為真。(一個目錄為了它的內容被訪問必然是可執行的) [ -x FILE ] 如果 FILE 存在且是可執行的則返回為真。 不常用的: [ -b FILE ] 如果 FILE 存在且是一個塊文件則返回為真。 [ -c FILE ] 如果 FILE 存在且是一個字符文件則返回為真。 [ -g FILE ] 如果 FILE 存在且設置了SGID則返回為真。 [ -h FILE ] 如果 FILE 存在且是一個符號符號鏈接文件則返回為真。(該選項在一些老系統上無效) [ -k FILE ] 如果 FILE 存在且已經設置了冒險位則返回為真。 [ -p FILE ] 如果 FILE 存並且是命令管道時返回為真。 [ -s FILE ] 如果 FILE 存在且大小非0時為真則返回為真。 [ -u FILE ] 如果 FILE 存在且設置了SUID位時返回為真。 [ -O FILE ] 如果 FILE 存在且屬有效用戶ID則返回為真。 [ -G FILE ] 如果 FILE 存在且默認組為當前組則返回為真。(只檢查系統默認組) [ -L FILE ] 如果 FILE 存在且是一個符號連接則返回為真。 [ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則返回為真。 [ -S FILE ] 如果 FILE 存在且是一個套接字則返回為真。 [ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在則返回為真。 [ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在則返回為真。 [ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的設備和節點號則返回為真。
字符串判斷
[ -z STRING ] 如果STRING的長度為零則返回為真,即空是真 [ -n STRING ] 如果STRING的長度非零則返回為真,即非空是真 [ STRING1 ] 如果字符串不為空則返回為真,與-n類似 [ STRING1 == STRING2 ] 如果兩個字符串相同則返回為真 [ STRING1 != STRING2 ] 如果字符串不相同則返回為真 [ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面則返回為真。 [ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面則返回為真。
數值判斷
[ INT1 -eq INT2 ] INT1和INT2兩數相等返回為真 ,= [ INT1 -ne INT2 ] INT1和INT2兩數不等返回為真 ,<> [ INT1 -gt INT2 ] INT1大於INT2返回為真 ,> [ INT1 -ge INT2 ] INT1大於等於INT2返回為真,>= [ INT1 -lt INT2 ] INT1小於INT2返回為真 ,< [ INT1 -le INT2 ] INT1小於等於INT2返回為真,<=
邏輯判斷
[ ! EXPR ] 邏輯非,如果 EXPR 是false則返回為真。 [ EXPR1 -a EXPR2 ] 邏輯與,如果 EXPR1 and EXPR2 全真則返回為真。 [ EXPR1 -o EXPR2 ] 邏輯或,如果 EXPR1 或者 EXPR2 為真則返回為真。 [ ] || [ ] 用OR來合並兩個條件 [ ] && [ ] 用AND來合並兩個條件
F高級特性:
雙圓括號(( )):表示數學表達式
在判斷命令中只允許在比較中進行簡單的算術操作,而雙圓括號提供更多的數學符號,而且在雙圓括號里面的'>','<'號不需要轉意。
雙方括號[[ ]]:表示高級字符串處理函數
雙方括號中判斷命令使用標准的字符串比較,還可以使用匹配模式,從而定義與字符串相匹配的正則表達式。
雙括號的作用:
在shell中,[ $a != 1 || $b = 2 ]是不允許出,要用[ $a != 1 ] || [ $b = 2 ],而雙括號就可以解決這個問題的,[[ $a != 1 || $b = 2 ]]。又比如這個[ "$a" -lt "$b" ],也可以改成雙括號的形式(("$a"
< "$b"))
if語句使用方法
最精簡的 if 命令的語法是: if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi
