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

シェルスクリプトで "${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」を理解する 「これについて話し合ってください。

答え2

if条件の左側を使用してくださいパターンマッチングバッシュ機能。一致する文字列に「Caused By」が含まれている場合、その文字列は削除されます。行はもはや以前と同じではないので、if句はトリガーされません。

以下は、シェルで実行できる例です。

echo -e "Number 1 Caused by me.\nNumber 2 is normal.\n" |
  while read line; do
    echo "${line#*'Caused by'}"
  done

結果:

 me.
Number 2 is normal.

答え3

タスク(またはこの場合は実行)は常により重要なので、実行時にこのスクリプトが実行するタスクを見てみましょう(出力をより冗長にすることについて理解してください)。

while read -r line
do 
  if [ "${line#*'Caused by'}" != "$line" ]; then
    echo "Line contains string Caused by"
  else
    echo "Line does not contain string Caused by"
  fi
done

Input: String with Caused by
Output: Line contains string Caused by
Input: Just a normal string
Output: Line does not contain string Caused by

このスクリプトで使用されるパターンの一致は、"${line#*'Caused by'}すべての文字列を最初から最後まで置き換えることです(ワイルドカードのため)。*原因入力行のパラメータ$lineを元のパラメータと比較して同じであることを確認します。簡単に言えば、行に文字列が含まれていることを確認するだけです。原因。最後に印刷してみてください。この行には文字列が含まれています。行に以下が含まれている場合原因

${parameter#word}いくつかの例を使って、型のシェルパラメータ拡張について簡単に紹介します。

パターンがパラメータ値の先頭に一致する場合、拡張結果は、最短一致パターン(「#」ケース)または最長一致パターン(「##」ケース)が削除されたパラメータ拡張値です。

$ test=aabbcc
$ echo ${test#*bb}                                                                    
$ cc

$ test=aabbcc
$ echo ${test#a*b}                                                                    
$ bcc

最も長い一致パターン形式の例:

$ test=aabbcc
$ echo ${test##a*b}                                                                     
$ cc

引用: man bash:${parameter#word}

関連情報