shell if 判斷
Shell數值、字符串比較
Chenxin
20181031 update
整數比較
-eq 等於,如:if [ "$a" -eq "$b" ]
-ne 不等於,如:if [ "$a" -ne "$b" ]
-gt 大於,如:if [ "$a" -gt "$b" ]
-ge 大於等於,如:if [ "$a" -ge "$b" ]
-lt 小於,如:if [ "$a" -lt "$b" ]
-le 小於等於,如:if [ "$a" -le "$b" ]
< 小於(須要雙括號),如:(("$a" < "$b"))
<= 小於等於(須要雙括號),如:(("$a" <= "$b"))正則表達式
大於(須要雙括號),如:(("$a" > "$b"))= 大於等於(須要雙括號),如:(("$a" >= "$b"))
字符串比較
= 等於,如:if [ "$a" = "$b" ]
== 等於,如:if [ "$a" == "$b" ],與=等價
注意:的功能在[[]]和[]中的行爲是不一樣的,以下:
1 [[ $a == z* ]] # 若是$a以"z"開頭(模式匹配)那麼將爲true
2 [[ $a == "z" ]] # 若是$a等於z(字符匹配),那麼結果爲true
3
4 [ $a == z* ] # File globbing 和word splitting將會發生
5 [ "$a" == "z" ] # 若是$a等於z(字符匹配),那麼結果爲true
一點解釋,關於File globbing是一種關於文件的速記法,好比"*.c"就是,再如~也是.可是file globbing並非嚴格的正則表達式,雖然絕大多數狀況下結構比較像.
!= 不等於,如:if [ "$a" != "$b" ]
這個操做符將在[[]]結構中使用模式匹配.
< 小於,在ASCII字母順序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" < "$b" ]
注意:在[]結構中"<"須要被轉義.
大於,在ASCII字母順序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" > "$b" ]
注意:在[]結構中">"須要被轉義.
-z (或者是"!") 字符串爲"null".就是長度爲0. 或者是用"!"驚歎號.
-n 字符串不爲"null" :[ -n "$2"]參數2不爲空(注意只是一箇中括號,><這些使用2個[])
注意:
使用-n在[]結構中測試必需要用""把變量引發來.使用一個未被""的字符串來使用! -z 的方式.
或者就是未用""引用的字符串自己,放到[]結構中。雖然通常狀況下能夠工做,但這是不安全的.習慣於使用""來測試字符串是一種好習慣.
if使用test
示例,if [ -d /home/lzadmin/.ssh ];then...
1)判斷表達式
if test (表達式爲真)
if test !表達式爲假
test 表達式1 –a 表達式2 兩個表達式都爲真
test 表達式1 –o 表達式2 兩個表達式有一個爲真
2)判斷字符串
test –n 字符串 字符串的長度非零
test –z 字符串 字符串的長度爲零
test 字符串1=字符串2 字符串相等
test 字符串1!=字符串2 字符串不等
3)判斷整數
test 整數1 –eq 整數2 整數相等
test 整數1 –ge 整數2 整數1大於等於整數2
test 整數1 –gt 整數2 整數1大於整數2
test 整數1 –le 整數2 整數1小於等於整數2
test 整數1 –lt 整數2 整數1小於整數2
test 整數1 –ne 整數2 整數1不等於整數2
4)判斷文件
test File1 –ef File2 兩個文件具備一樣的設備號和i結點號
test File1 –nt File2 文件1比文件2 新
test File1 –ot File2 文件1比文件2 舊
test –b File 文件存在而且是塊設備文件
test –c File 文件存在而且是字符設備文件
test –d File 文件存在而且是目錄
test –e File 文件存在
test –f File 文件存在而且是正規文件
test –g File 文件存在而且是設置了組ID
test –G File 文件存在而且屬於有效組ID
test –h File 文件存在而且是一個符號連接(同-L)
test –k File 文件存在而且設置了sticky位
test –b File 文件存在而且是塊設備文件
test –L File 文件存在而且是一個符號連接(同-h)
test –o File 文件存在而且屬於有效用戶ID
test –p File 文件存在而且是一個命名管道
test –r File 文件存在而且可讀
test –s File 文件存在而且是一個套接字
test –t FD 文件描述符是在一個終端打開的
test –u File 文件存在而且設置了它的set-user-id位
test –w File 文件存在而且可寫
test –x File 文件存在而且可執行
SHELL下的數字比較及計算舉例
比較:
方法一: if [ ${A} -lt ${B} ]; then ...
這是最基本的比較方法,使用lt(小於),gt(大於),le(小於等於),ge(大於等於),優勢:還沒發現;缺點:只能比較整數,使用lt,gt等不直觀
方法二: if ((${A} < ${B})) then ...
這是CShell風格比較,優勢:不用使用lt,gt等難記的字符串;缺點:仍是隻能比較整數
方法三: if (echo ${A} ${B} | awk '!($1>$2){exit 1}') then ...
這是使用awk比較,優勢:能夠比較小數;缺點:表達式太複雜,難記
方法四: if (echo ${A} - ${B} | bc -q | grep -q "^-"); then ...
這是使用bc計算比較,優勢:能夠比較小數;缺點:表達式更復雜,難記
計算:
方法一:typeset C=$(expr ${A} + ${B});
SHELL中的基本工具,優勢:方便檢測變量是否爲數字;缺點:只能計算整數,且只能計算加減法,不能計算乘除法
方法二:let "C=${A}+${B}"; 或 let "C=A+B"
內嵌命令計算,優勢:能計算乘除法及位運算等;缺點:只能計算整數
方法三:typeset C=$((A+B))
CShell風格的計算,優勢:能計算乘除法及位運算等,簡介,編寫方便;缺點:不能計算小數
方法四:typeset C=${echo ${A} ${B} | awk '{print $1+$2}')
使用awk計算,優勢:能計算小數,能夠實現多種計算方式,計算靈活;缺點:表達式太複雜
方法五:typeset C=${echo ${A} + ${B} | bc -q)
使用awk計算,優勢:能計算小數,計算方式比awk還多,計算靈活;缺點:表達式太複雜,小數點後面的位數必須使用scale=N來設置,不然可能會將結果截斷爲整數
if的或關係
習慣於使用""來測試字符串是一種好習慣.使用-n在[]結構中測試必需要用""把變量引發來.
使用一個未被""的字符串來使用! -z .或者就是未用""引用的字符串自己,放到[]結構中。雖然通常狀況下能夠工做,但這是不安全的.shell
bash上能夠:
if [ -n "$inVar5" ] || [ -n "$inVar6" ]; then
在bash 下
if [ -z $inVar5 -o -z $inVar6 ]
在tcsh下
if [ -z $inVar5 || -z $inVar6 ]安全
if判斷ip地址
cat t.shbash
ip=$1 if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.' ip=($ip)
IFS=$OIFS if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]];then echo "$ip is the right IP address" else echo "$ip is wrong IP!!!" fi else echo "$ip is wrong IP!!!" fi