我有一個字串,我想檢查它是否包含子字串。所以我正在使用這個命令。下面是 Linux shell 腳本。我只是想知道 if 語句中的條件是如何運作的?
STRING1='This string contains substring.'
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
echo "Substring is present"
fi
答案1
這是一種複雜且 ksh 特定的(儘管現在受到其他一些 shell 支援)編寫標準的方式:
case $STRING1 in
*substr*) echo Substring is present
esac
或特定於 ksh 的:
if [[ $STRING1 = *substr* ]]; then
echo Substring is present
fi
${var/pattern/replacement}
是一個 ksh 參數擴充運算符,它擴展為$var
第一次出現的pattern
已替換為的值replacement
。
第一次出現的情況${STRING1/substr/}
也是如此,沒有任何內容替換,因此被刪除。$STRING1
substr
[[ string = pattern ]]
和[[ string != pattern ]]
是另一個 ksh 特定構造,用於將字串與模式進行匹配。當模式被引用時,它是按字面意思理解的,[[ string = "string" ]]
相等運算符也是如此(以及不等式!=
)。
因此,如果和[[ $STRING1 != "${STRING1/substr/}" ]]
的擴充產生不同的字串,則該指令傳回 true,而這種情況只有在至少出現一次inside時才會發生,因此這是檢查contains的方法。$STRING1
${STRING!/substr/}
substr
$STRING1
$STRING1
substr
雖然 和 都不[[...]]
是${var/pattern/replacement}
標準sh
語法,但[
命令和${var#pattern}
運算符(後一個也來自 ksh)是標準的。所以有時你會看到這樣的程式碼:
if [ "$STRING1" != "${STRING1#*substr*}" ]; then
echo Substring is present
fi
這是檢查變數是否包含子字串的標準(儘管不是 Bourne)方法,但又很複雜,並且比明顯的case
語句方法沒有優勢。
答案2
檢查它是否包含子字串
看起來執行起來更簡單
[ -z "${s##*substr*}" ] && echo Substring is present
如果存在,則展開的結果${…}
為 null(零長度) 。substr
... if 語句中的條件如何運作?這
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
正在比較兩個字串,原始未修改的字串和substr
刪除 ( /substr/}
) 的相同字串。如果不同 ( !=
),則原始字串包含substr
。