Linux 比較判斷運算(if else)

pursuer.chen發表於2016-04-27

介紹

本篇文章主要是列舉在shell命令中常出現的一些用來做比較的運算子,這些運算子是編寫shell指令碼的基礎;

 

 

if else基本語法

1、基本語法:
if [ command ]; then
符合該條件執行的語句
fi
2、擴充套件語法:
if [ command ];then
符合該條件執行的語句
elif [ command ];then
符合該條件執行的語句
else
符合該條件執行的語句
fi

數值運算子

注意:數值運算子只是針對數值的比較,如果用來比較的是字元或者字串則會返回報錯“ integer expression expected”

  -eq 等於則為真,如果是對整數進行比較相當於“=”

  -ne 不等於則為真,如果是對整數進行比較相當於“!=”

  -gt 大於則為真,如果是對整數進行比較相當於“>”

  -ge 大於等於則為真,如果是對整數進行比較相當於“>=”

  -lt 小於則為真,如果是對整數進行比較相當於“<”

  -le 小於等於則為真,如果是對整數進行比較相當於“<=”

 

字串比較符

=:字串包含的文字是否一樣

== 兩個字串是否相等

>:比較字母的大小,比如var1 > var2,如果var1字母大於var2則返回真

<:和大於相反

!= 兩個字串不相等

-z 空字串

-n 非空字串

注意:字串的比較有時候有可能需要用雙中括號“[[   ]]”,比如呼叫了命令進行比較,如果這個時候還是使用單中括號會報錯,如下:

#!/bin/bash
var1="a";
var2="a"
if [[ `cat $var1` = `cat $var2` ]]
then
echo "eq"
else
echo "neq"
fi

cat命令應用的必須是個檔案,不能直接引號內容。

檔案運算子

檔案/目錄判斷:

[ -a FILE ] :如果 FILE 存在則為真。

[ -b FILE ] :如果 FILE 存在且是一個塊特殊檔案則為真。

[ -c FILE ] :如果 FILE 存在且是一個字特殊檔案則為真。

[ -d FILE ] :如果 FILE 存在且是一個目錄則為真。

[ -e FILE ] :如果 FILE 存在則為真。

[ -f FILE ] :如果 FILE 存在且是一個普通檔案則為真。

[ -g FILE ] :如果 FILE 存在且已經設定了SGID則為真。

[ -h FILE ] :如果 FILE 存在且是一個符號連線則為真。

[ -k FILE ] :如果 FILE 存在且已經設定了粘制位則為真。

[ -p FILE ] :如果 FILE 存在且是一個名字管道(F如果O)則為真。

[ -r FILE ] :如果 FILE 存在且是可讀的則為真。

[ -o OPTIONNAME ] :如果 shell選項 “OPTIONNAME” 開啟則為真。

[ -s FILE ] :如果 FILE 存在且大小不為o則為真。

[ -t FD ] :如果檔案描述符 FD 開啟且指向一個終端則為真。

[ -u FILE ] :如果 FILE 存在且設定了SUID (set user ID)則為真。

[ -w FILE ] :如果 FILE 如果 FILE 存在且是可寫的則為真。

[ -x FILE ] :如果 FILE 存在且是可執行的則為真。

[ -z STRING ]: “STRING” 的長度為零則為真。

[ -O FILE ]:如果 FILE 存在且屬有效使用者ID則為真。

[ -G FILE ]:如果 FILE 存在且屬有效使用者組則為真。

[ -L FILE ] :如果 FILE 存在且是一個符號連線則為真。

[ -n string ]:判斷內容是否為空

[ -N FILE ]: 如果 FILE 存在 and has been mod如果ied since it was last read則為真。

[ -S FILE ] :如果 FILE 存在且是一個套接字則為真。

[ FILE1 -nt FILE2 ] :如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not則為真。

[ 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來合併兩個條件

其他判斷
[ -t FD ] 如果檔案描述符 FD (預設值為1)開啟且指向一個終端則返回為真
[ -o optionname ] 如果shell選項optionname開啟則返回為真


IF高階特性:
雙圓括號(( )):表示數學表示式
在判斷命令中只允許在比較中進行簡單的算術操作,而雙圓括號提供更多的數學符號,而且在雙圓括號裡面的'>','<'號不需要轉意。

雙方括號[[ ]]:表示高階字串處理函式
雙方括號中判斷命令使用標準的字串比較,還可以使用匹配模式,從而定義與字串相匹配的正規表示式。

可以用test命令檢查某個條件是否成立,它可以進行數值、字串和檔案3個方面的測試,如果使用了test那麼就不要使用[]將命令括起來,否則會返回報告如“too many arguments” 。

#!/bin/bash
var1="a"
var2="b"
var3="/data/test"
if test  $var1 == $var2
 then
 echo "$var1=$var2"
else
 echo "$var1!=$var2"
fi
 echo "$var1,$var2"

if test -x "$var3"
then
echo "可執行檔案"
fi

 

邏輯判斷符

-a:與操作,可以用&&代替

-0:或操作,可以用||代替 

!:非操作

算術運算子 

+

-

*

/


+=:例如var+=1等同於var=var+1

-=

*=

/= 

 

位操作符

 

 注意:所有的這些運算子前後都要有空格否則就不是比較而是賦值操作。

總結

 

 

 

 

 

備註:

    作者:pursuer.chen

    部落格:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。

《歡迎交流討論》

 

相關文章