Shell 詳解 檢測某個條件是否成立

2022-07-21 13:18:21 字數 2418 閱讀 9094

[[ ]]是 shell 內建關鍵字,它和 test 命令類似,也用來檢測某個條件是否成立。

test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 還能做到。可以認為 [[ ]] 是 test 的公升級版,對細節進行了優化,並且擴充套件了一些功能。

[[ ]] 的用法為:

[[ expression ]]

當 [[ ]] 判斷 expression 成立時,退出狀態為 0,否則為非 0 值。注意[[ ]]expression之間的空格,這兩個空格是必須的,否則會導致語法錯誤。

[[ ]] 是 shell 內建關鍵字,不是命令,在使用時沒有給函式傳遞引數的過程,所以 test 命令的某些注意事項在 [[ ]] 中就不存在了,具體包括:

請看下面的演示**:

#!/bin/bash

read str1

read str2

if [[ -z $str1 ]] || [[ -z $str2 ]] #不需要對變數名加雙引號

then

echo "字串不能為空"

elif [[ $str1 < $str2 ]] #不需要也不能對 < 進行轉義

then

echo "str1 < str2"

else

echo "str1 >= str2"

fi

執行結果:

str1 < str2

對多個表示式進行邏輯運算時,可以使用邏輯運算子將多個 test 命令連線起來,例如:

[ -z "$str1" ] || [ -z "$str2" ]

你也可以借助選項把多個表示式寫在乙個 test 命令中,例如:

[ -z "$str1" -o -z "$str2" ]

但是,這兩種寫法都有點「彆扭」,完美的寫法是在乙個命令中使用邏輯運算子將多個表示式連線起來。我們的這個願望在 [[ ]] 中實現了,[[ ]]  支援 &&、|| 和 ! 三種邏輯運算子。

使用 [[ ]] 對上面的語句進行改進:

[[ -z $str1 || -z $str2 ]]

這種寫法就比較簡潔漂亮了。

注意,[[ ]] 剔除了 test 命令的-o-a選項,你只能使用 || 和 &&。這意味著,你不能寫成下面的形式:

[[ -z $str1 -o -z $str2 ]]

當然,使用邏輯運算子將多個 [[ ]] 連線起來依然是可以的,因為這是 shell 本身提供的功能,跟 [[ ]] 或者 test 沒有關係,如下所示:

[[ -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 ]]

在 shell [[ ]] 中,可以使用=~來檢測字串是否符合某個正規表示式,它的用法為:

[[ str =~ regex ]]

str 表示字串,regex 表示正規表示式。

下面的**檢測乙個字串是否是手機號:

#!/bin/bash

read tel

if [[ $tel =~ ^1[0-9]$ ]]

then

echo "你輸入的是手機號碼"

else

echo "你輸入的不是手機號碼"

fi執行結果1:

13203451100

你輸入的是手機號碼

執行結果2:

132034511009

你輸入的不是手機號碼

^1[0-9]$的說明:

本文並不打算講解正規表示式的語法,不了解的讀者請猛擊《正規表示式30分鐘入門教程》。

有了 [[ ]],你還有什麼理由使用 test 或者 [ ],[[ ]] 完全可以替代之,而且更加方便,更加強大。

但是 [[ ]] 對數字的比較仍然不友好,所以我建議,以後大家使用 if 判斷條件時,用 (()) 來處理整型數字,用 [[ ]] 來處理字串或者檔案。

iOS 檢測是否安裝某個應用

在ios9中,需要在 info.plist 中設定所涉及到的 url scheme 到白名單,設定方法如下 開啟info.plist,可以選擇以 方式開啟 新增如下例子內容 twitterstring fbstring array wechatstring weixinstring sinaweib...

iOS 檢測是否安裝某個應用

在ios9中,需要在 info.plist 中設定所涉及到的 url scheme 到白名單,設定方法如下 開啟info.plist,可以選擇以 方式開啟 新增如下例子內容 twitter fbweixin sinaweibo sinaweibosso weibosdk weibosdk2.5 mq...

linux利用shell監聽某個程式是否完成

應用場景 希望檢測某個程式是否已經執行完成,一旦完成,則執行其他程式。1 首先通過ps u檢視當前使用者下的所有程式的程序,選擇你要監聽的程序號,比如9160。注意 ps a是檢視當前使用者所執行的所有程式程序,不包括其他使用者 ps aux是檢視所有程序,包括其他使用者。2 編寫shell 實現監...