shell判斷數組中是否包含某個元素:node
ary=(1 2 3)正則表達式
a=2shell
if [[ "${ary[@]}" =~ "$a" ]] ; then
echo "a in ary"
else
echo "a not in ary"
fi數組
判讀字符串($str)是否包含另外一個字符串($str1):安全
方法1:bash
if [ `echo $str | grep -e '$str1'` ] ; thenless
echo yessocket
fi測試
方法2(若是$str1在判斷中直接使用字符串而不是變量,則不能加引號,如if [[ $str =~ ^dx ]]判讀字符串$str是否以dx開頭,^dx不能加引號):unix
if [[ $str =~ $str1 ]] ; then
echo yes
fi
比較兩個字符串是否相等的辦法是:
if [ "$test"x = "test"x ]; then
這裏的關鍵有幾點:
1 使用單個等號
2 注意到等號兩邊各有一個空格:這是unix shell的要求
3 注意到"$test"x最後的x,這是特地安排的,由於當$test爲空的時候,上面的表達式就變成了x = testx,顯然是不相等的。而若是沒有這個x,表達式就會報錯:[: =: unary operator expected
二元比較操做符,比較變量或者比較數字.注意數字與字符串的區別.
整數比較
-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"))
小數據比較可以使用AWK
字符串比較
= 等於,如: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" ]
注意:在[]結構中">"須要被轉義.
具體參考Example 26-11來查看這個操做符應用的例子.
-z 字符串爲"null".就是長度爲0.
-n 字符串不爲"null"
注意:
使用-n在[]結構中測試必需要用""把變量引發來.使用一個未被""的字符串來使用! -z
或者就是未用""引用的字符串自己,放到[]結構中。雖然通常狀況下可
以工做,但這是不安全的.習慣於使用""來測試字符串是一種好習慣.
if判斷式
if [ 條件判斷一 ] && (||) [ 條件判斷二 ]; then
elif [ 條件判斷三 ] && (||) [ 條件判斷四 ]; then
else
執行第三段內容程式
fi
例如:
root@Bizbox:~# a=0
root@Bizbox:~# b=0
root@Bizbox:~# c=5
root@Bizbox:~# if [ $a = 0 -a $b = 0 ]&&[ $c != 0 ]; then
> echo success
> fi
success
if 使用的表達式
Primary 意義
[ -a 文件 ] 若是文件存在爲真。
[ -b 文件 ] 若是 文件 存在 並且 是一個 塊-特殊 文件爲真。
[ -c 文件 ] 爲真 若是 文件 存在 並且 是一個 字-特殊 文件。
[ -d 文件 ] 爲真 若是 文件 存在 並且 是一個 目錄。
[ -e 文件 ] 爲真 若是 文件 存在。
[ -f 文件 ] 爲真 若是 文件 存在 並且 是一個 普通 文件。
[ -g 文件 ] 爲真 若是 文件 存在 並且 已經設置了他的 SGID 位。
[ -h 文件 ] 爲真 若是 文件 存在 並且 是一個 符號鏈接。
[ -k 文件 ] 爲真 若是 文件 存在 並且 他的粘住位已經設置。
[ -p 文件 ] 爲真 若是 文件 存在 並且 是一個 已經命名的管道 (F 若是O)。
[ -r 文件 ] 爲真 若是 文件 存在 並且 是可讀的。
[ -s 文件 ] 爲真 若是 文件 存在 並且 比零字節大。
[ -t FD ] 爲真 若是 文件 文件描述符已經打開 並且 指向一個終端。
[ -u 文件 ] 爲真 若是 文件 存在 並且 已經設置了他的 SUID (set user ID)位。
[ -w 文件 ] 爲真 若是 文件 爲真 若是 文件 存在 並且 是可寫的。
[ -x 文件 ] 爲真 若是 文件 存在 並且 是可執行的。
[ -O 文件 ] 爲真 若是 文件 存在 並且 屬於有效用戶ID。
[ -G 文件 ] 爲真 若是 文件 存在 並且 屬於有效組ID。
[ -L 文件 ] 爲真 若是 文件 存在 並且 是一個 符號鏈接。
[ -N 文件 ] 爲真 若是 文件 存在 並且 has been mod 若是ied since it was last read。
[ -S 文件 ] 爲真 若是 文件 存在 並且 是一個 socket。
[ 文件1 -nt 文件2 ] 爲真 若是 文件1 has been changed more recently than 文件2, or 若是
文件1 存在 並且
文件2 does not。
[ 文件1 -ot 文件2 ] 爲真 若是 文件1 比 文件2 舊, 或者 文件2 存在並且 文件1 不存在。
[ 文件1 -ef 文件2 ] 爲真 若是 文件1 並且 文件2 refer to the same device 並且 inode
numbers。
[ -o 選項名 ] 爲真 若是 shell 選項 "選項名" 開啓。
[ -z STRING ] 爲真 若是 "STRING"的長度是零。
[ -n STRING ] 或者 [ STRING ] 爲真 "STRING"的長度是非零值。
[ STRING1 == STRING2 ] 若是兩個字符串相等爲真。 "=" may be used instead of "==" for
strict POSIX compliance。
[ STRING1 != STRING2 ] 爲真 若是 兩兩個字符串不相等。
[ STRING1 < STRING2 ] 爲真 若是 "STRING1" sorts before "STRING2" lexicographically in the
current locale。
[ STRING1 > STRING2 ] 爲真 若是 "STRING1" sorts after "STRING2" lexicographically in the
current locale。
[ ARG1 OP ARG2 ]
"OP" 是 -eq, -ne, -lt, -le, -gt or -ge 其中一個。 These arithmetic binary operators
return 爲真 若是 "ARG1" is equal to, not equal to, less than, less than or equal to, greater
than, or greater than or equal to "ARG2", respectively。 "ARG1" 並且 "ARG2" are
integers。
表達式能夠借如下操做符組合起來, listed in decreasing order of precedence:
操做符效果
[ ! EXPR ] 若是EXPR 爲假則爲真。
[ ( EXPR ) ] 返回EXPR 的值。 這樣能夠用來忽略正常的操做符優先級。
[ 表達式1 -a 表達式2 ] 若是表達式1 並且表達式2 同時爲真則爲真 。
[ 表達式1 -o 表達式2 ] 若是表達式1 或者表達式2 其中之一爲真則爲真。
==========================================
shell中變量間接引用:
假設a=b,b=123,如何經過a得到123呢,經過變量間接引用能夠作到:eval a=\$$b (bash版本2中a=${!b}也能夠作到)