shell的條件判斷主要分爲三大部分的內容:
條件測試類型
條件測試表達式
語句之間的邏輯關係
條件測試表達式
1、表達式的寫法:
[ expression ]
` expression `
test expression
2、條件測試表達式的注意事項:
[ expression ] expression 和中括號之間是有空格,如果沒有空格將會報錯。
[ expression ] ` expression ` 作用相同,但是含義不同。
test expression 其中test是shell提供的一個命令。其返回結構是expression的邏輯結果
3、何時需要使用 [ expression ]
當bash shell的腳本中出現 類似-gt,-lt這樣的整數測試符或者 -e $FILE 這樣的文件測試符的時間纔可以使用[],
if [ grep 'root' /etc/passwd ] 這樣是錯誤的。
if 可以直接使用 grep 'root' /etc/passed的命令結果的。
[root@bogon sh]# cat if.sh
#!/bin/bash
if grep 'root' /etc/passwd &> /dev/null ;then
echo "there is root "
else
echo "there is no root"
fi
[root@bogon sh]# ./if.sh
there is root
從命令的執行結果可以知道:if 可以取得grep命令的執行結果。相當與執行來grep命令後的$?的值。此處,我們也需要仔細理解何時需要使用 &>/dev/null 如果我們需要命令執行的返回值,那麼不許要使用 &>/dev/null ,如果我們需要命令執行結果,也就是說相當與命令執行完成後的$?值,那麼,就需要使用&>/dev/null.
條件測試類型:對shell而言,常用的條件測試類型有三種:整數測試;字符串測試;文件測試
整數測試:
測試符 | 用法舉例 | 含義 |
-gt | [ $A -gt $B ] | gt:great then 如果$A大於$B 結果爲真,否則結果爲假。 |
-lt | [ $A -lt $B ] | lt:less then 如果$A小於$B結果爲真,否則爲假 |
-eq | [ $A -eq $B ] | eq:equal 如果$A 等於$B 結果爲真,否則結果爲假 |
-ge | [ $A -ge $B ] | 如果$A大於等於$B結果爲真,否則結果爲假 |
-le | [ $A -le $B ] | 如果$A小於$B結果爲真,否則結果爲假 |
-ne | [ $A -ne $B ] | 如果$A不等於$B 結果爲真,否則結果爲假 |
其中整數測試需要注意的事項有:
整數測試的運算符都是雙目運算符
測試符的兩側數據只能是整數。浮點數是不可以的。
測試數與中括號是有空格符的。
字符串測試:可以分別用操作符 =、 !=、< 和 > 比較字符串是否相等、不相等或者第一個字符串的排序在第二個字符串的前面或後面。單目操作符 -z 測試 null 字符串,如果字符串非空 -n 返回 True(或者根本沒有操作符)。
= :[ 'abc' = 'dcf' ] # 判斷=兩側的字符串是否一樣 #注意區分下面的例子。
[root@localhost sh]# [ 'abc' = 'dcf' ];echo $?
1
[root@localhost sh]# [ 'abc'='dcf' ];echo $?
0
!= [ 'abc' != 'dcf' ] #判斷兩個字符串是否不等,不等爲真,否則未見
[root@localhost sh]# [ 'abc' != 'dcf' ];echo $?
0
< [ 'abc' \< 'bcd' ] # 判斷後面的字符串是否在前面的字符串的前面
[root@bogon testdir]# [ 'abc' \< 'bcd' ] ; echo $?
0
> 同理,判斷前面的字符串排序是否在後面字符串的前面
字符串測試單目操作符: -z ,-n
[root@bogon testdir]# [ -n 'abc' ];echo $?
0
[root@bogon testdir]# [ -n '' ];echo $?
1
[ -n $STRING ] 如果$STRING 是空,則返回爲真,否則返回爲假。
[root@bogon testdir]# [ -z 'abc' ]; echo $?
1
[root@bogon testdir]# [ -z ' ' ];echo $?
1
[root@bogon testdir]# [ -z ];echo $?
0
[root@bogon testdir]# [ -z $STRING ] ;echo $?
0
[ -z $STRING ] 如果$STRING 爲NULL,或者根本沒有定義,返回爲真,否則返回爲假。
小結:
字符串測試符號,中有單目運算符 [ -n $STRING ] [ -z $STRING ] 也有雙目運算符,= ;!=;
<; > 需要注意的-z -n的區別,和<,>需要使用轉義字符\
文件測試:
測試符 | 用法舉例 | 含義 |
-f | [ -f $FILE ] | 如果$FILE是普通文件,返回真,否則返回假 |
-d | [ -d $FILE ] | 如果$FILE是目錄,返回真,否則返回假 |
-r | [ -r $FILE ] | 如果$FILE 是可讀的,返回真,否則返回假 |
-w | [ -w $FILE ] | 如果$FILE 是可寫的,返回真,否則返回假 |
-x | [ -x $FILE ] | 如果$FILE 是可執行的,返回真,否則返回假 |
-s | [ -s $FILE ] | 如果$FILE是非空的,返回真,否則返回假 |
-e | [ -e $FILE ] | 如果$FILE 是存在的,返回真,否則返回假 |
注意:
$FILE,需要路徑,也就是腳本能找到的路徑。
語句間的邏輯關係:
&&:邏輯與
|| ; 邏輯或
command1 && command2;
如果com1 返回值是假,那麼com2不會執行
如果com1 返回只是真,那麼com2一定要執行,二者執行的結果決定com1 && com2的返回結果
com1 || com2
如果com1 執行結果爲真,那麼com2不會執行,
如果com1執行結果爲假,那麼com2一定要執行,二者執行的結果決定com1 || com2的返回的結果
以上就是短路邏輯的實例。
條件測試是shell腳本的基礎,涉及的內容包括,測試表達式的寫法,條件測試的分類,各種測試符的使用。也包括語句之間的邏輯關係。需要特別理解短路邏輯的含義。