誰かがシェルスクリプトでこれが何を意味するのかを説明できますか?
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 by
Yes
これは次のような効果があります。
if [[ "$line" == *'Caused by'* ]]; then
echo 'Yes'
fi
bash
、またはksh93
、zsh
または
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}