Shell中內置關鍵字[[]]

[[ ]] 是 Shell 內置關鍵字,它和 test 命令類似,也用來檢測某個條件是否成立
test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 還能做到。可以認爲 [[ ]] 是 test 的升級版,對細節進行了優化,並且擴展了一些功能

[[ ]] 的用法爲:

[[ expression ]]

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

"""
[[ ]] 不需要注意某些細枝末節
[[ ]] 是 Shell 內置關鍵字,不是命令,在使用時沒有給函數傳遞參數的過程,所以 test 命令的某些注意事項在 [[ ]] 中就不存在了,具體包括:

    不需要把變量名用雙引號""包圍起來,即使變量是空值,也不會出錯。
    不需要、也不能對 >、< 進行轉義,轉義後會出錯
"""

[root@server1 mnt]# sh test.sh 
redhat
redhat
str1 >= str2
[root@server1 mnt]# cat test.sh 
#!/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

[[ ]] 支持邏輯運算符
對多個表達式進行邏輯運算時,可以使用邏輯運算符將多個 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 ]]

[root@server1 mnt]# sh test.sh 
239379147
你輸入的不是手機號碼
[root@server1 mnt]# sh test.sh 
13679276901
你輸入的是手機號碼
[root@server1 mnt]# cat test.sh 
#!/bin/bash
read tel
if [[ $tel =~ ^1[0-9]{10}$ ]]
then
    echo "你輸入的是手機號碼"
else
    echo "你輸入的不是手機號碼"
fi

"""
對^1[0-9]{10}$的說明:

    ^匹配字符串的開頭(一個位置);
    [0-9]{10}匹配連續的十個數字;
    $匹配字符串的末尾(一個位置)
"""
 

發佈了83 篇原創文章 · 獲贊 14 · 訪問量 2033
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章