Shell[[]]檢測某個條件是否成立
[[ ]]是 Shell 內(nèi)置關(guān)鍵字,它和 test 命令類似,也用來檢測某個條件是否成立。
test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 還能做到??梢哉J(rèn)為 [[ ]] 是 test 的升級版,對細(xì)節(jié)進(jìn)行了優(yōu)化,并且擴(kuò)展了一些功能。
[[ ]] 的用法為:
[[ expression ]]
當(dāng) [[ ]] 判斷 expression 成立時,退出狀態(tài)為 0,否則為非 0 值。注意[[ ]]和expression之間的空格,這兩個空格是必須的,否則會導(dǎo)致語法錯誤。
[[ ]] 不需要注意某些細(xì)枝末節(jié)
[[ ]] 是 Shell 內(nèi)置關(guān)鍵字,不是命令,在使用時沒有給函數(shù)傳遞參數(shù)的過程,所以 test 命令的某些注意事項(xiàng)在 [[ ]] 中就不存在了,具體包括:
不需要把變量名用雙引號""包圍起來,即使變量是空值,也不會出錯。
不需要、也不能對 >、< 進(jìn)行轉(zhuǎn)義,轉(zhuǎn)義后會出錯。
請看下面的演示代碼:
#!/bin/bash ? read str1 read str2 ? if [[ -z $str1 ]] || [[ -z $str2 ]] ?#不需要對變量名加雙引號 then ? ? echo "字符串不能為空" elif [[ $str1 < $str2 ]] ?#不需要也不能對 < 進(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)算符
對多個表達(dá)式進(jìn)行邏輯運(yùn)算時,可以使用邏輯運(yùn)算符將多個 test 命令連接起來,例如:
[ -z "$str1" ] || [ -z "$str2" ]
你也可以借助選項(xiàng)把多個表達(dá)式寫在一個 test 命令中,例如:
[ -z "$str1" -o -z "$str2" ]
但是,這兩種寫法都有點(diǎn)“別扭”,完美的寫法是在一個命令中使用邏輯運(yùn)算符將多個表達(dá)式連接起來。我們的這個愿望在 [[ ]] 中實(shí)現(xiàn)了,[[ ]] 支持 &&、|| 和 ! 三種邏輯運(yùn)算符。
使用 [[ ]] 對上面的語句進(jìn)行改進(jìn):
[[ -z $str1 || -z $str2 ]]
這種寫法就比較簡潔漂亮了。
注意,[[ ]] 剔除了 test 命令的-o和-a選項(xiàng),你只能使用 || 和 &&。這意味著,你不能寫成下面的形式:
[[ -z $str1 -o -z $str2 ]]
當(dāng)然,使用邏輯運(yùn)算符將多個 [[ ]] 連接起來依然是可以的,因?yàn)檫@是 Shell 本身提供的功能,跟 [[ ]] 或者 test 沒有關(guān)系,如下所示:
[[ -z $str1 ]] || [[ -z $str2 ]]
該表總結(jié)了各種寫法的對錯
| 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 [[ ]] 中,可以使用=~來檢測字符串是否符合某個正則表達(dá)式,它的用法為:
[[ str =~ regex ]] str 表示字符串,regex 表示正則表達(dá)式。
下面的代碼檢測一個字符串是否是手機(jī)號:
#!/bin/bash
?
read tel
?
if [[ $tel =~ ^1[0-9]{10}$ ]]
then
? ? echo "你輸入的是手機(jī)號碼"
else
? ? echo "你輸入的不是手機(jī)號碼"
fi運(yùn)行結(jié)果1:
13203451100
你輸入的是手機(jī)號碼
運(yùn)行結(jié)果2:
132034511009
你輸入的不是手機(jī)號碼
對^1[0-9]{10}$的說明:
- ^匹配字符串的開頭(一個位置)
- [0-9]{10}匹配連續(xù)的十個數(shù)字
- $匹配字符串的末尾(一個位置)
本文并不打算講解正則表達(dá)式的語法,不了解的讀者請猛擊《正則表達(dá)式30分鐘入門教程》。
總結(jié)
有了 [[ ]],你還有什么理由使用 test 或者 [ ],[[ ]] 完全可以替代之,而且更加方便,更加強(qiáng)大。
但是 [[ ]] 對數(shù)字的比較仍然不友好,所以我建議,以后大家使用 if 判斷條件時,用 (()) 來處理整型數(shù)字,用 [[ ]] 來處理字符串或者文件。
到此這篇關(guān)于Shell[[]]檢測某個條件是否成立的文章就介紹到這了,更多相關(guān)Shell[[]]檢測條件成立內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Shell實(shí)現(xiàn)判斷進(jìn)程是否存在并重新啟動腳本分享
這篇文章主要介紹了Shell實(shí)現(xiàn)判斷進(jìn)程是否存在并重新啟動腳本分享,本文給出了兩個實(shí)現(xiàn)腳本,分簡潔版和詳細(xì)版,需要的朋友可以參考下2014-09-09
詳解Linux中atime,mtime,ctime的使用場景
這篇文章主要介紹了Linux的三個時間atime,mtime,ctime詳細(xì)說明與使用場景,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起了解一下2022-10-10
Shell實(shí)現(xiàn)系統(tǒng)時間和BIOS時間同步校準(zhǔn)腳本分享
這篇文章主要介紹了Shell實(shí)現(xiàn)系統(tǒng)時間和BIOS時間同步校準(zhǔn)腳本分享,本文給出了多個時間同步服務(wù)器,然后用ntpdate輪詢同步,需要的朋友可以參考下2014-10-10
Linux實(shí)現(xiàn)文件定期本地備份/異地備份/刪除備份的腳本
數(shù)據(jù)備份的意義就在于,當(dāng)受到網(wǎng)絡(luò)攻擊、入侵、電源故障或者操作失誤等事故的發(fā)生后,可以完整、快速、簡捷、可靠地恢復(fù)原有系統(tǒng)。本文為大家準(zhǔn)備了文件定期本地備份/異地備份/刪除備份的腳本,希望對你們有所幫助2022-10-10
Linux查看系統(tǒng)時間的詳細(xì)方法總結(jié)
系統(tǒng)時間是計算機(jī)硬件和軟件運(yùn)行的基礎(chǔ),在Linux系統(tǒng)中,查看系統(tǒng)時間是一項(xiàng)基本任務(wù),本文將從多個方面介紹Linux查看系統(tǒng)時間的詳細(xì)方法,需要的朋友可以參考下2023-09-09
解決VirtualBox中Ubuntu 14.04屏幕分辨率不能設(shè)置的問題
下面小編就為大家?guī)硪黄鉀QVirtualBox中Ubuntu 14.04屏幕分辨率不能設(shè)置的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

