Bash

case-substring 函式和引用

  • August 10, 2021

我在腳本中使用一個簡單的函式來檢查字元串是否包含特定的子字元串:

#!/bin/bash 
#
subs() {
   case $2 in
        *$1*)
             return 0 ;;
        *)
             return 1 ;;
   esac
}

# example 1

res="$(grep -E '^blufoobla|^blubarbla' ~/test/file)"

subs foo "$res" || echo "blufoobla" >> ~/test/file
subs bar "$res" || echo "blubarbla" >> ~/test/file

# example 2

keym=us-whatever_foo

if subs - "$keym"; then
   echo there
else
   echo nope
fi

問題1:我必須$1在函式的案例模式中引用嗎?案例模式中未加引號的變數被解釋為 glob。因此 - 我猜 - 在這種特殊情況下不需要引用變數。但我不確定……

問題2:我是否必須引用函式的第一個參數(subs foo "$res"subs "foo" "$res"/subs - "$keym"subs "-" "$keym"..?

我想避免過度引用。

我必須在函式的案例模式中引用 $1 嗎?

取決於,您希望它是模式還是硬字元串?

即不帶引號的模式,這將匹配:

a='*.txt'
case file.txt in $a) echo match;; esac;

相反,它"$a")不會。

問題 2:我是否必須引用函式的第一個參數( subs foo ) $ res" or subs “foo” " $ 水庫“/潛艇-” $ keym" or subs “-” " $ 鍵"

不必。如果您知道變數中的值不包含 glob 字元或IFS字元,或者您知道您想要分詞和萬用字元,那麼可以肯定的是,擴展不需要引號。

但是,如果輸入來自未知來源,例如此處的輸入文件,您可能希望使腳本正常工作,而不管數據到底是什麼。這需要引用這樣的擴展。是的,這是使標準 shell 語言難看且難以使用的原因之一。Zsh 在這方面更好。

不過,靜態字元串-對 shell 來說並不特殊,因此引用它不會做任何事情,也不需要。

引用自:https://unix.stackexchange.com/questions/664074