C語言中文網 目錄
Shell腳本
1 Shell是什么
2 Shell是運維人員必須掌握的技能
3 常用的Shell有哪些
4 進入Shell的兩種方式
5 Shell命令的基本格式
6 Shell命令的本質到底是什么?如何自己實現一個命令?
7 Shell命令的選項和參數在本質上是什么
8 Shell命令提示符
9 修改命令提示符
10 第一個Shell腳本
11 執行Shell腳本
12 Shell四種運行方式(啟動方式)
13 Shell配置文件(配置腳本)的加載
14 如何編寫自己的Shell配置文件?
15 Shell變量
16 Shell變量的作用域
17 Shell命令替換
18 Shell位置參數
19 Shell特殊變量
20 Shell $*和$@的區別
21 Shell $?
22 Shell字符串詳解
23 Shell字符串拼接
24 Shell字符串截取
25 Shell數組
26 Shell獲取數組長度
27 Shell數組拼接
28 Shell刪除數組元素
29 Shell關聯數組
30 Shell內建命令
31 Shell alias命令
32 Shell echo命令
33 Shell read命令
34 Shell exit命令
35 Shell declare和typeset命令
36 Shell數學計算
37 Shell (())
38 Shell let命令
39 Shell $[]
40 Shell expr命令
41 Linux bc命令
42 Shell declare -i
43 Shell if else
44 Shell退出狀態
45 Shell test命令
46 Shell [[]]
47 Shell case in
48 Shell while
49 Shell until
50 Shell for
51 Shell select in
52 Shell break和continue
53 Shell函數
54 Shell函數參數
55 Shell函數返回值精講
56 Shell重定向
57 Linux中的文件描述符到底是什么?
58 結合文件描述符談重定向,徹底理解重定向的本質!
59 使用exec命令操作文件描述符
60 Shell代碼塊重定向
61 Shell Here Document
62 Shell Here String
63 Shell組命令
64 Shell進程替換
65 Linux管道
66 子Shell和子進程到底有什么區別?
67 如何檢測子Shell和子進程?
68 Shell過濾器
69 Linux中的信號
70 Bash Shell中的信號
71 Linux進程是什么
72 Shell模塊化(把代碼分散到多個腳本文件中)
首頁 > Shell腳本 閱讀:2,426

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

< 上一頁Shell test命令 Shell case in下一頁 >

[[ ]]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
運行結果:
http://www.frifeb11.com/shell/
http://data.biancheng.net/
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]{10}$ ]]
then
    echo "你輸入的是手機號碼"
else
    echo "你輸入的不是手機號碼"
fi
運行結果1:
13203451100
你輸入的是手機號碼

運行結果2:
132034511009
你輸入的不是手機號碼

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

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

總結

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

但是 [[ ]] 對數字的比較仍然不友好,所以我建議,以后大家使用 if 判斷條件時,用 (()) 來處理整型數字,用 [[ ]] 來處理字符串或者文件。
< 上一頁Shell test命令 Shell case in下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo