linux shell bash 比較操作
阿新 • • 發佈:2019-01-31
整數比較
-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" ],與=等價
注意: [[]]和[]中的行為在某些情況下是不同的:
[[ $a == z* ]] # 如果$a 以"z"開頭(模式匹配)那麼將為true
[[ $a == "z*" ]] # 如果$a 等於z* (字元匹配),那麼結果為true
[ $a == z* ] # File globbing 和word splitting 將會發生
[ "$a" == "z*" ] # 如果$a 等於z* (字元匹配),那麼結果為true
File globbing 是一種關於檔案的速記法,比如"*.c"就是,再如~也是.
但是file globbing 並不是嚴格的正則表示式,雖然絕大多數情況下結構比較像.
(筆者不太懂, 假如在/tmp目錄下有一個a.txt檔案,則[ "a.txt" = a.* ]會返回邏輯真,但如果/tmp下有a.txt和a.out兩個檔案,則這樣寫Shell會報錯)
!= 不等於,如:if [ "$a" != "$b" ]
注意:!= 在[[]]結構中使用模式匹配.
< 小於,在ASCII 字母順序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]結構中"<"需要被轉義.
> 大於,在ASCII 字母順序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]結構中">"需要被轉義.
-z 字串為空.就是長度為0.
-n 字串不為空
注意: 對於字串或數字的比較, 加上雙引號("")是沒有壞處的, 而且能避免一些不必要的麻煩(請參考,但模式和正則表示式不能加雙引號.
混合比較
-a 邏輯與
exp1 -a exp2 如果exp1 和exp2 都為true 的話,這個表示式將返回true
-o 邏輯或
exp1 -o exp2 如果exp1 和exp2 中有一個為true 的話,那麼這個表示式就返回true
但在[[]]使用&&和|| 代替-a 和-o, -o 和-a 一般都是搭配test 命令或者[]
看一些例子:
01
#!/bin/bash
02
# 數字和字串比較
03
04
# 這裡的變數a 和b 既可以當作整型也可以當作是字串.
05
# 因為Bash 變數並不是強型別的.
06
a=4
07
b=5
08
# a,b作為整數進行比較
09
if [ "$a" -ne "$b" ]
10
then
11
echo "$a is not equal to $b"
12
echo "(arithmetic comparison)"
13
fi
14
echo
15
# a,b作為字串進行比較
16
if [ "$a" != "$b" ]
17
then
18
echo "$a is not equal to $b."
19
echo "(string comparison)"
20
fi
21
22
# 在這個特定的例子中,"-ne"和"!="都可以.
23
24
exit 0
01
#!/bin/bash
02
# 測試字串是否為null
03
# $string1 沒被宣告和初始化
04
if [ -n $string1 ]
05
then
06
echo "String \"string1\" is not null."
07
else
08
echo "String \"string1\" is null."
09
fi
10
# 錯誤的結果.
11
# 顯示$string1 為非空,雖然他沒被初始化.
12
13
echo
14
15
# 給$string1加上雙引號再試一下.
16
if [ -n "$string1" ]
17
then
18
echo "String \"string1\" is not null."
19
else
20
echo "String \"string1\" is null."
21
fi
22
# 這次輸出我們預期的結果
23
24
echo
25
26
if [ $string1 ] # 這次$string1 變成"裸體"的了,相當於[ -n $string1 ]
27
then
28
echo "String \"string1\" is not null."
29
else
30
echo "String \"string1\" is null."
31
fi
32
33
string1=initialized
34
if [ $string1 ] # 再來
35
then
36
echo "String \"string1\" is not null."
37
else
38
echo "String \"string1\" is null."
39
fi
40
# 這次輸出我們期望的結果
41
42
# 但最好還是給字串加上雙引號"", 因為這可以避免不必要的麻煩,也是一種好習慣