シェルスクリプトで "${line#*'Caused By'}" != "$line" とはどういう意味ですか?

シェルスクリプトで

誰かがシェルスクリプトでこれが何を意味するのかを説明できますか?

while read -r line
do 
  if [ "${line#*'Caused By'}" != "$line" ]; then
    echo "Yes"
  fi
done       

ベストアンサー1

${line#*'Caused By'}変数置換の特定のインスタンスです${parameter#word}bashマニュアルに記録されているように)。POSIX規格ではshシェルの場合)。

では、値の先頭から${parameter#word}パターンが削除されます。削除するため、「最小プレフィックスパターンの削除」と呼ばれます。word$parameter最短word(のパターンに一致する一致するプレフィックス文字列で置き換えることによって##削除#されます。最長プレフィックス文字列と一致)。

この特定の例では、文字列Caused by(およびそれ以前のすべての項目*)がある場合は値から削除されます$line。文字列の周りの一重引用符は重複しています。

置換結果を変数自体の値と比較し、テキストがある場合は印刷して、決定された値にテキストが$line含まれているかどうかをテストします。Caused byYes

これは次のような効果があります。

if [[ "$line" == *'Caused by'* ]]; then
    echo 'Yes'
fi

bash、またはksh93zshまたは

case "$line" in
    *'Caused by'*) echo 'Yes'
esac

どんなsh殻でも。


質問のループは標準入力から「ライン」を読みます。質問参照」「IFS=read-r-line」を理解する 「これについて話し合ってください。

おすすめ記事