新聞中心
[[ ]]是 Shell 內(nèi)置關(guān)鍵字,它和 test 命令類似,也用來檢測(cè)某個(gè)條件是否成立。
在敖漢等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需求定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè)公司,敖漢網(wǎng)站建設(shè)費(fèi)用合理。
test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 還能做到??梢哉J(rèn)為 [[ ]] 是 test 的升級(jí)版,對(duì)細(xì)節(jié)進(jìn)行了優(yōu)化,并且擴(kuò)展了一些功能。
[[ ]] 的用法為:
[[ expression ]]
當(dāng) [[ ]] 判斷 expression 成立時(shí),退出狀態(tài)為 0,否則為非 0 值。注意
[[ ]]和
expression之間的空格,這兩個(gè)空格是必須的,否則會(huì)導(dǎo)致語法錯(cuò)誤。
[[ ]] 不需要注意某些細(xì)枝末節(jié)
[[ ]] 是 Shell 內(nèi)置關(guān)鍵字,不是命令,在使用時(shí)沒有給函數(shù)傳遞參數(shù)的過程,所以 test 命令的某些注意事項(xiàng)在 [[ ]] 中就不存在了,具體包括:
- 不需要把變量名用雙引號(hào)
""包圍起來,即使變量是空值,也不會(huì)出錯(cuò)。 - 不需要、也不能對(duì) >、< 進(jìn)行轉(zhuǎn)義,轉(zhuǎn)義后會(huì)出錯(cuò)。
請(qǐng)看下面的演示代碼:
#!/bin/bash
read str1
read str2
if [[ -z $str1 ]] || [[ -z $str2 ]] #不需要對(duì)變量名加雙引號(hào)
then
echo "字符串不能為空"
elif [[ $str1 < $str2 ]] #不需要也不能對(duì) < 進(jìn)行轉(zhuǎn)義
then
echo "str1 < str2"
else
echo "str1 >= str2"
fi
運(yùn)行結(jié)果:
http://c.biancheng.net/shell/
http://data.biancheng.net/
str1 < str2
[[ ]] 支持邏輯運(yùn)算符
對(duì)多個(gè)表達(dá)式進(jìn)行邏輯運(yùn)算時(shí),可以使用邏輯運(yùn)算符將多個(gè) test 命令連接起來,例如:
[ -z "$str1" ] || [ -z "$str2" ]
你也可以借助選項(xiàng)把多個(gè)表達(dá)式寫在一個(gè) test 命令中,例如:
[ -z "$str1" -o -z "$str2" ]
但是,這兩種寫法都有點(diǎn)“別扭”,完美的寫法是在一個(gè)命令中使用邏輯運(yùn)算符將多個(gè)表達(dá)式連接起來。我們的這個(gè)愿望在 [[ ]] 中實(shí)現(xiàn)了,[[ ]] 支持 &&、|| 和 ! 三種邏輯運(yùn)算符。
使用 [[ ]] 對(duì)上面的語句進(jìn)行改進(jìn):
[[ -z $str1 || -z $str2 ]]
這種寫法就比較簡(jiǎn)潔漂亮了。
注意,[[ ]] 剔除了 test 命令的-o和-a選項(xiàng),你只能使用 || 和 &&。這意味著,你不能寫成下面的形式:
[[ -z $str1 -o -z $str2 ]]
當(dāng)然,使用邏輯運(yùn)算符將多個(gè) [[ ]] 連接起來依然是可以的,因?yàn)檫@是 Shell 本身提供的功能,跟 [[ ]] 或者 test 沒有關(guān)系,如下所示:
[[ -z $str1 ]] || [[ -z $str2 ]]
| test 或 [] | [[ ]] | ||
|---|---|---|---|
| [ -z "$str1" ] || [ -z "$str2" ] | √ | [[ -z $str1 ]] || [[ -z $str2 ]] | √ |
| [ -z "$str1" -o -z "$str2" ] | √ | [[ -z $str1 -o -z $str2 ]] | × |
| [ -z $str1 || -z $str2 ] | × | [[ -z $str1 || -z $str2 ]] | √ |
[[ ]] 支持正則表達(dá)式
在 Shell [[ ]] 中,可以使用
=~來檢測(cè)字符串是否符合某個(gè)正則表達(dá)式,它的用法為:
[[ str =~ regex ]]
str 表示字符串,regex 表示正則表達(dá)式。
下面的代碼檢測(cè)一個(gè)字符串是否是手機(jī)號(hào):
#!/bin/bash
read tel
if [[ $tel =~ ^1[0-9]{10}$ ]]
then
echo "你輸入的是手機(jī)號(hào)碼"
else
echo "你輸入的不是手機(jī)號(hào)碼"
fi
運(yùn)行結(jié)果1:
13203451100
你輸入的是手機(jī)號(hào)碼
運(yùn)行結(jié)果2:
132034511009
你輸入的不是手機(jī)號(hào)碼
對(duì)
^1[0-9]{10}$的說明:
-
^匹配字符串的開頭(一個(gè)位置); -
[0-9]{10}匹配連續(xù)的十個(gè)數(shù)字; -
$匹配字符串的末尾(一個(gè)位置)。
本文并不打算講解正則表達(dá)式的語法,不了解的讀者請(qǐng)猛擊《正則表達(dá)式30分鐘入門教程》。
總結(jié)
有了 [[ ]],你還有什么理由使用 test 或者 [ ],[[ ]] 完全可以替代之,而且更加方便,更加強(qiáng)大。
但是 [[ ]] 對(duì)數(shù)字的比較仍然不友好,所以我建議,以后大家使用 if 判斷條件時(shí),用 (()) 來處理整型數(shù)字,用 [[ ]] 來處理字符串或者文件。
文章標(biāo)題:Shell[[]]詳解:檢測(cè)某個(gè)條件是否成立
標(biāo)題來源:http://m.fisionsoft.com.cn/article/cdeijie.html


咨詢
建站咨詢
