Linux 中的 $STRING1 != "${STRING1/substr/}"

Linux 中的 $STRING1 != "${STRING1/substr/}"

我有一個字串,我想檢查它是否包含子字串。所以我正在使用這個命令。下面是 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/}也是如此,沒有任何內容替換,因此被刪除。$STRING1substr

[[ string = pattern ]][[ string != pattern ]]是另一個 ksh 特定構造,用於將字串與模式進行匹配。當模式被引用時,它是按字面意思理解的,[[ string = "string" ]]相等運算符也是如此(以及不等式!=)。

因此,如果和[[ $STRING1 != "${STRING1/substr/}" ]]的擴充產生不同的字串,則該指令傳回 true,而這種情況只有在至少出現一次inside時才會發生,因此這是檢查contains的方法。$STRING1${STRING!/substr/}substr$STRING1$STRING1substr

雖然 和 都不[[...]]${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

相關內容