大文字と小文字の部分文字列関数と参照

大文字と小文字の部分文字列関数と参照

文字列に特定の部分文字列が含まれていることを確認するために、スクリプトは単純な関数を使用しています。

#!/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

関数の大文字と小文字のパターンで$ 1を引用する必要がありますか?

パターンになりたいですか、それともハード文字列にしたいですか?

つまり、パターンが引用されていない場合は、次のようになります。

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

逆に"$a")、そうではありません。

Q2:関数の最初のパラメータを引用する必要があります(subs foo "$res"またはsubs "foo" "$res" / subs - "$keym"またはsubs "-" "$keym")

あなたはしません持つ到着もしあなたなら知る変数の値にワイルドカードやIFS文字が含まれていない場合、またはワードセパレータとワイルドカードが必要な場合は、もちろん拡張の周りの引用符は必要ありません。

ただし、入力がここで入力ファイルなどの不明なソースから来る場合は、makeスクリプトが次のように動作するようにすることができます。データはそうです。これを行うには、そのような拡張を参照する必要があります。はい、これが標準シェル言語が見苦しくて使いにくい理由の1つです。この点ではZshが良いです。

ただし、静的文字列は-シェルに特別なものではないため、引用符は何も実行されず、必要ありません。

関連情報