Shell 基本上是一個命令直譯器,類似於 DOS 下的 command。它接收使用者命令(如 ls 等),然後調用相應的應用程式。較為通用的 Shell 有標準的Bourne shell (sh)和C shell (csh)。
很多時候在寫 Shell 指令碼的時候都容易遺忘部分邏輯運算子和運算式的寫法,因此摘錄如下,留待不時之需查詢使用。
Shell 邏輯運算子涉及以下幾種類型,只要適當選擇,可以解決我們很多複雜的判斷,達到事半功倍效果。
一、邏輯判斷
1、關於檔案與目錄的邏輯判斷
-f 常用。判斷『檔案』是否為普通檔案,比如: if [ -f filename ]
-d 常用。判斷『目錄』是否存在
-b 判斷是否為一個『 block 檔案』
-c 判斷是否為一個『 character 檔案』
-S 判斷是否為一個『 socket 標籤檔案』
-L 判斷是否為一個『 symbolic link 的檔案』
-e 判斷『檔案』是否存在
2、關於程式的邏輯判斷
-G 判斷是否由 GID 所執行的程式所擁有
-O 判斷是否由 UID 所執行的程式所擁有
-p 判斷是否為程式間傳送資訊的 name pipe 或是 FIFO
3、關於檔案的屬性判斷
-r 判斷是否為可讀的屬性
-w 判斷是否為可以寫入的屬性
-x 判斷是否為可執行檔屬性
-s 判斷是否為『非空白檔案』
-u 判斷是否具有『 SUID 』的屬性
-g 判斷是否具有『 SGID 』的屬性
-k 判斷是否具有『 sticky bit 』的屬性
4、兩個檔案之間的判斷與比較
-nt 第一個檔案比第二個檔案新
-ot 第一個檔案比第二個檔案舊
-ef 第一個檔案與第二個檔案為同一個檔案( link 之類的檔案)
5. 布林運算子
&& 邏輯與
|| 邏輯或
! 邏輯非
二、運算子號
= 等於 應用於:整型或字串比較 如果在[] 中,只能是字串
!= 不等於 應用於:整型或字串比較 如果在[] 中,只能是字串
< 小於 應用於:整型比較 在[] 中,不能使用表示字串
> 大於 應用於:整型比較 在[] 中,不能使用表示字串
-eq 等於 應用於:整型比較
-ne 不等於 應用於:整型比較
-lt 小於 應用於:整型比較
-gt 大於 應用於:整型比較
-le 小於或等於 應用於:整型比較
-ge 大於或等於 應用於:整型比較
-a 雙方都成立(and) 相當於 &&
-o 單方成立(or) 相當於 ||
-z Null 字元串
-n 非Null 字元串
三、邏輯運算式
注意:所有字元與邏輯運算子直接用“空格”分開,不能連到一起。
1、test 命令
使用方法:test EXPRESSION
如:
代碼如下 |
複製代碼 |
[root@localhost ~]# test 1 = 1 && echo 'ok' ok [root@localhost ~]# test -d /etc/ && echo 'ok' ok [root@localhost ~]# test 1 -eq 1 && echo 'ok' ok [root@localhost ~]# if test 1 = 1 ; then echo 'ok'; fi ok |
2、精簡運算式
[] 運算式
代碼如下 |
複製代碼 |
[root@localhost ~]# [ 1 -eq 1 ] && echo 'ok' ok [root@localhost ~]# [ 2 < 1 ] && echo 'ok' -bash: 1: No such file or directory [root@localhost ~]# [ 2 < 1 ] && echo 'ok' [root@localhost ~]# [ 2 -gt 1 -a 3 -lt 4 ] && echo 'ok' ok [root@localhost ~]# [ 2 -gt 1 && 3 -lt 4 ] && echo 'ok' |
-bash: [: missing `]'注意:在[] 運算式中,常見的>,<需要加逸出字元,表示字串大小比較,以acill碼位置作為比較。不直接支援<>運算子,還有邏輯運算子 || 和 && 它需要用-a[and] –o[or]表示。
[[]] 運算式
代碼如下 |
複製代碼 |
[root@localhost ~]# [ 1 -eq 1 ] && echo 'ok' ok [root@localhost ~]# [[ 2 < 3 ]] && echo 'ok' ok [root@localhost ~]# [[ 2 < 3 && 4 < 5 ]] && echo 'ok'
|
ok注意:[[]] 運算子只是[]運算子的擴充。能夠支援<,>符號運算不需要轉義符,它還是以字串比較大小。裡面支援邏輯運算子 || 和 &&
bash 的條件運算式中有三個幾乎等效的符號和命令:test,[]和[[]]。通常,大家習慣用if [];then這樣的形式。而[[]]的出現,根據ABS所說,是為了相容><之類的運算子。
不考慮對低版本bash和對sh的相容的情況下,用[[]]是相容性強,而且效能比較快,在做條件運算時候,可以使用該運算子。