shell中的條件測試及字符串判斷
1、條件測試語法
在bash的各種流程控制機構中通常要進行各種測試,然後根據測試結果執行不同的操作,有時也會通過if等條件語句相結合,讓我們可以方便的完成判斷。
語法說明:
格式1:test 測試表達式
格式2:[ 測試表達式 ]
格式3:[[ 測試表達式 ]]
上面的格式中,格式1和格式2是等價的。格式3爲擴展的test命令。
注意:在[[ ]]中可以使用通配符進行模式匹配,如&&、||、>、<等操作符可以應用於[[ ]]中,但不能應用於[ ]中。
例1:格式1示例,判斷zhangsan.txt這個文件是否存在
[root@localhost ~]# test -f zhangsan.txt && echo true||echo false
false
[root@localhost ~]# touch zhangsan.txt
[root@localhost ~]# test -f zhangsan.txt && echo true||echo false
true
例2:格式1示例,test命令非(!)的寫法,文件存在就輸出false
[root@localhost ~]# test ! -f zhangsan.txt && echo true||echo false
false
例3:格式2示例兩種判斷方法,第一種判斷文件是否存在,第二種判斷文件是否不存在
[root@localhost ~]# [ -f zhangsan.txt ] && echo true||echo false
true
[root@localhost ~]# [ ! -f zhangsan.txt ] && echo true||echo false
false
例4:格式3示例,判斷兩個文件是否同時存在
[root@localhost ~]# [[ -f zhangsan.txt && -f lisi.txt ]] && echo true||echo false
false
[root@localhost ~]# touch lisi.txt
[root@localhost ~]# [[ -f zhangsan.txt && -f lisi.txt ]] && echo true||echo false
true
2、shell中常用文件測試操作符
操作符 | 說明 |
-b file | 檢測文件是否存在且是塊設備文件,如果是,則爲真 |
-c file | 檢測文件是否存在且是字符設備文件,如果是,則爲真 |
-d file | 檢測文件是否存在且是目錄,如果是,則爲真 |
-f file | 檢測文件是否存在且是普通文件(既不是目錄,也不是設備文件),如果是,則爲真 |
-g file | 檢測文件是否存在且設置了 SGID 位,如果是,則爲真 |
-k file | 檢測文件是否存在且設置了粘着位(Sticky Bit),如果是,則爲真 |
-p file | 檢測文件是否存在且是有名管道,如果是,則爲真 |
-u file | 檢測文件是否存在且設置了 SUID 位,如果是,則爲真 |
-r file | 檢測文件是否存在且可讀,如果是,則爲真 |
-w file | 檢測文件是否存在且可寫,如果是,則爲真 |
-x file | 檢測文件是否存在且可執行,如果是,則爲真 |
-s file | 檢測文件是否存在且爲空(文件大小是否大於0),不爲空返回 true。 |
-e file | 檢測文件(包括目錄)是否存在,如果是,則爲真 |
f1 -nt f2 | 檢測文件f1是否比文件f2新,如果是,則爲真 |
f1 -ot f2 | 檢測文件f1是否比文件f2舊,如果是,則爲真 |
3、shell中字符串測試操作符
字符串運算符列表 | ||
運算符 | 說明 | 舉例 |
= | 檢測兩個字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 檢測兩個字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 檢測字符串長度是否爲0,爲0返回 true。 | [ -z $a ] 返回 false。 |
-n | 檢測字符串長度是否不爲0,不爲0返回 true。 | [ -n $a ] 返回 true。 |
str | 檢測字符串是否爲空,不爲空返回 true。 | [ $a ] 返回 true。 |
特別注意:以上表格中的字符串測試操作符號務必要用雙引號” ”引起來,如[ -n “$name” ]以免出錯。
4、整數二元比較操作符
關係運算符列表 | ||
[ ]中使用的比較符 | (( ))和[[ ]]中使用的比較符 | 說明 |
-eq | == | equal縮寫,相等 |
-ne | != | not equal縮寫,不相等 |
-gt | > | greater than縮寫,大於 |
-lt | < | less than縮寫,小於 |
-ge | >= | greater equal縮寫,大於等於 |
-le | <= | less equal縮寫,小於等於 |
提示:
(1)”<”小於,if [[“$a” < ”$b”]],if [ “$a” \< “$b” ]。在單中括號中大於號(>)和小於號(<)需要轉義,因爲shell也使用<號和>號進行重定向。
(2)”=”等於號和”!=”不等於號,if [[“$a” = ”$b”]],if [ “$a” = “$b” ]在單中括號中等於和不等於號不需要轉義。
5、邏輯操作符
布爾運算符列表 | ||
[ ]中使用的邏輯操作符 | [[ ]]中使用的邏輯操作符 | 說明 |
! | ! | 非運算 ,相反則爲真 |
-o | || | 或運算,兩邊有一個爲真,則真 |
-a | && | 與運算,兩邊都爲真,則真 |
6、if分支結構
單分支語法:
if [ 條件 ]
then
指令
fi
雙分支語法:
if [ 條件 ]
then
指令
else
指令
fi
多分支語法:
if [ 條件 ]
then
指令
elif 條件
then
指令
…………………….
else
指令
fi
多判斷條件if語句,同樣的也可以把下面的&&替換爲||也可以。
#!/bin/bash
#多判斷條件if語句示例
d=2
e=3
#方法1,使用單中括號結合&&符號進行多條件判斷
#if [ $? -eq 0 ] && [ $d -eq 2 ] && [ $e -lt 5 ];then
#方法2,使用單中括號結合-a選項進行多條件判斷(-a是與運算,相當於&&符號,)
#if [ $? -eq 0 -a $d -eq 2 -a $e -lt 5 ];then
#方法3,使用雙中括號結合&&符號進行多條件判斷
#if [[ $? = 0 ]] && [[ $d = 2 ]] && [[ $e < 5 ]];then
if [[ $? = 0 && $d = 2 && $e < 5 ]];then
echo "true"
fi
條件表達式配合大括號的用法
[ $? -ne 0 ] || {
echo "命令沒有執行成功"
exit 1
}
7、擴展:判斷字符串是否爲數字的多種方法
7.1、方法1:sed加正則表達式
組合語法判斷1:
[ -n “`echo $num|sed ‘s/[0-9]’//g`” -a -n “`echo $2|sed ‘s/[0-9]//g’`” ] && echo “兩個參數必須爲數字” && exit 1
組合語法判斷2:
[ -n “`echo $num|sed ‘s/[0-9]//g’`” -a -n “`echo $2|sed ‘s/[0-9]//g’`” ] && {
echo “兩個參數必須爲數字”
exit 1
}
單個判斷語法:
[ -n “`echo $1|sed ‘s/[0-9]//g’`” ] && echo “第一個參數必須爲數字” && exit 1
[ -n “`echo $2|sed ‘s/[0-9]//g’`” ] && echo “第二個參數必須爲數字” && exit 1
普通變量判斷:
[ -n “`echo $num|sed ‘s/[0-9]//g’`” ] && echo “第二個參數必須爲數字” && exit 1
條件表達式,大括號的用法:
[ -n “`echo $num|sed ‘s/[0-9]//g’`” ] && {
echo “第二個參數必須爲數字”
exit 1
}
7.2、方法2:變量的子串替換加正則表達式
[root@localhost ~]# num=long123
[root@localhost ~]# [ -z "`echo "${num//[0-9]/}"`" ] && echo 1||echo 0
0 #這個結果說明前面的結果不爲0,即有非數字字符
[root@localhost ~]# num=500
[root@localhost ~]# [ -z "`echo "${num//[0-9]/}"`" ] && echo 1||echo 0
1 #這個結果說明前面的結果去掉數字後爲0,即沒有非數字字符
7.3、方法3:變量的子串替換加正則表達式(特殊判斷思路)
思路:如果num長度不爲0,並且把num中的非數字部分刪除,然後看結果是不是等於num本身,如果兩者都成立就是數字。
-n “$num” #如果num長度不爲0表達式
“$num” = “${num//[^0-9]/}” #把num中的非數字部分刪除,然後看結果是不是等於num本身,如果兩者都成立就是數字。
完整表達式:
[root@localhost ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num"
it is num
7.4、方法4:expr計算判斷
[root@localhost ~]# expr $1 + 0 &>/dev/null
[root@localhost ~]# [ $? -eq 0 ] && echo int