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

