玩轉Bash腳本:test測試語句
總第1篇
test
test就是測試的意思,常用在流程控制語句中作為條件。下面做一下介紹。
測試整數
整數的test就是大小關系的比較,與其他語言不同,Bash中沒有使用<,>來做大于等于號,而是使用了減號開頭的選項來比較。
假如有兩個整數變量a和b。那么比較a是否大于b,就寫作 test $a -gt $b ,符合條件返回真值1。實際在終端里測試的時候可以這樣寫來看test語句的執行結果
如果條件成立打印 Yes,不成立不打印。
全部的關系比較選項為:
選項 | 描述 | 英文全稱 |
eq | 等于 | equal |
gt | 大于 | greater than |
lt | 小于 | less than |
ne | 不等于 | not equal |
ge | 大于等于 | greater or equal |
le | 小于等于 | less or equal |
Bash腳本,或者說Shell終端中的各種命令都有很豐富的選項,所以我建議在記憶的時候要去記憶它的英文全稱,理解了它的含義,這樣反而會降低記憶的難度。
測試字符串
字符串的測試無非就是包括,判斷兩個字符串是否相等,判斷一個字符串是否為空。
假設str1和str2是持有兩個字符串的變量(直接測試兩個字符串,而非字符串變量時,則不加$,這很好理解)。具體用法為:
test $str1 = $str2 | 測試是否相等,相等返回1 |
test $str1 != $str2 | 測試是否不等,不等返回1 |
test $str1 \< $str2 | 如果str1的字典序在str2之前,則返回1 |
test $str1 \> $str2 | 如果str1的字典序在str2之后,則返回1 |
test $str1 | 如果不為空返回1 |
test -n $str1 | 如果不為空返回1 |
test -z $str1 | 如果是空串,返回1 |
關于字典序的那兩個比較,其實就是大于號 > 和小于號 <。因為bash中這兩個符號有重定向的意思,所以這里要使用反斜杠\ 轉義。
選項-n是 nonzero 的縮寫。選項-z是 zero 的縮寫。這樣好記憶了吧
測試文件
測試文件需要用到大量的選項,這里我只寫一個常用的,其他的大家自行 man test
針對單個文件
選項 |
描述 |
d | 是否為目錄 |
f | 是否為普通文件 |
x | 是否有執行權限 |
r | 是否有讀權限 |
w | 是否寫讀權限 |
e | 是否存在 |
s | 文件大小是否大于0 |
c | 是否為字符設備文件 |
b | 是否為塊設備文件 |
以上條件在成立的時候返回真值1。具體用法比如:
- 01.test -f hello.c
- 02.test -d /home
- 03....
針對兩個文件
用法 | 描述 |
test file1 -nt file2 | 測試file1的修改時間是不是比file2 new(晚) |
test file1 -ot file2 | 測試file1的修改時間是不是比file2 old(早) |
test file1 -ef file2 | 測試兩者是相同的設備和具有相同的結點(inode)數 |
同樣的,若是條件成立則返回真值1。注意這里的file1,file2就是文件名的字符串了。
- 01.#可以直接
- 02.test a.c -nt b.c
- 03.#或者是
- 04.a=a.c
- 05.b=b.c
- 06.test $a -nt $b
不再細表。
邏輯運算
邏輯運算就是與或非。
- -a 邏輯與
- -o 邏輯或
- ! 邏輯非
用法如:
- 01.test $a -lt $b -a $a -gt $c
- 02.test $a -lt $b -o $a -gt $c
- 03.test ! -d sleep.sh && echo Yes #如果sleep.sh不是目錄,就打印Yes
其實完整版是這樣:
- 01.test $a -lt $b -a test $a -gt $c
- 02.test $a -lt $b -o test $a -gt $c
簡化版test
在讀完這一部分后,你可能會驚呼,怎么不早點告訴我。哈哈。
其實以上所有的test命令都可以用方括號替換。比如
test -f hello.c
可以換成
[ -f hello.c ]
怎么樣,很方便吧。注意的是,方括號和表達式前后各有一個空格間隔哦。不要丟掉。實際也就是 [空格-f hello.c空格]
其他注意的地方是方括號的邏輯表達式,比如
test $a -lt $b -a $a -gt $c
可以轉化為
[ $a -lt $b -a $a -lt $c ]
或者分開作為兩條語句
[ $a -lt $b -a ]&&[ $a -lt $c ]
這個&&并無什么特別之處,并非方括號運算所獨有。此處就是當前面語句為真時,接著執行后面的語句。所有的Bash語句都可以用&&或||連接。
原文鏈接:http://blog.csdn.net/guodongxiaren/article/details/38014669