[[ ]] 對數字的比較不友好,所以使用 if 判斷條件時,建議用(())來處理整型數字,用來處理字串或者檔案。
用法說明
指令碼支援邏輯運算子
(())
((expression))
不需要注意空格
在 (( )) 中使用變數可以加也可以不加$
字首,(( )) 會自動解析變數名
只用於進行整數運算
可以使用<、<=、>、>=等進行整數運算
表示式可以只有乙個,也可以有多個,多個表示式之間以逗號,
分隔
對於多個表示式的情況,以最後乙個表示式的值作為整個 (( )) 命令的執行結果。
支援邏輯運算子,邏輯運算子為&& ||
((a>7 && b==c))
test/
test expression
或[ expression ]
注意空格
shell 內建命令
>、<、== 只能用來比較字串
比較數字需要使用 -eq、-gt 等選項;
不管是比較字串還是數字,test 都不支援 >= 和 <=。
變數名建議用雙引號""
包圍起來
比較字串時需要對 >、<進行轉義
支援邏輯運算子,邏輯運算子為-o -a
[ -z "$str1" ]||[ -z "$str2" ]#建議對變數名加雙引號
[[$str1\<$str2]]#需要對 < 進行轉義
[ -z "$str1" ] || [ -z "$str2" ]
√
使用-o -a !選項
[ -z "$str1" -o -z "$str2" ]
√
[ -z "$str1" || -z "$str2" ]
×
[[ ]] 是test 的公升級版,對細節進行了優化,並且擴充套件了一些功能
[[ expression ]]
注意空格
shell 內建關鍵字,不是命令,在使用時沒有給函式傳遞引數的過程,所以 test 命令的某些注意事項在 [[ ]] 中就不存在了
>、<、== 只能用來比較字串
比較數字需要使用 -eq、-gt 等選項;
不需要把變數名用雙引號""
包圍起來,即使變數是空值,也不會出錯。
不需要、也不能對 >、< 進行轉義,轉義後會出錯。
支援正規表示式!!
支援邏輯運算子,邏輯運算子為&& ||
[[ -z $str1 ]] || [[ -z $str2 ]] #不需要對變數名加雙引號
[[ $str1 < $str2 ]] #不需要也不能對 < 進行轉義
[[ ]] 剔除了 test 命令的-o
和-a
選項,你只能使用 || 和 &&
[[ -z $str1 ]]||[[ -z $str2 ]]
√
[[ -z $str1 -o -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分鐘入門教程》
shell擷取檔案中的關鍵字
實現方法有如下幾種 expr substr a 1 8 echo a awk echo a cut c1 8 echo expr a echo a dd bs 1 count 8 2 dev null 1 第一種方法 從左向右擷取最後乙個string後的字串 從左向右擷取第乙個string後的字串 ...
Go內建關鍵字分析(一)
go語言中總共有25個關鍵字,如下所示 作用 定義變數 舉例 var x int 4 or x 4注意 a.在函式 中,簡潔賦值語句在明確型別的 前提下,可以用於替代 var 定義。b.結構不能使用在函式外,函式外的每個語法塊都必須以關鍵字開始。演示 package main import fmt ...
C 中struct關鍵字和class關鍵字的區別
剛開始接觸 c 看到 中有struct關鍵字,還以為是用了結構體,結果後來發現 struct 和 class 一樣都用於類的定義,於是把兩者的差別記錄於此。一句話總結 兩者均可用於定義類,唯一的區別是兩者定義的類的預設訪問許可權有差別。其實比兩者差別更重要的是,我很好奇為什麼 c 中會存在兩個用於定...