文字列があり、ここに部分文字列が含まれていることを確認したいと思います。だから私はこのコマンドを使用しています。以下はLinuxシェルスクリプトです。 if文の条件がどのように機能するかを知りたいです。
STRING1='This string contains substring.'
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
echo "Substring is present"
fi
答え1
これは標準を作成する複雑でksh関連(現在は他のシェルでもサポートされている)方法です。
case $STRING1 in
*substr*) echo Substring is present
esac
またはksh固有:
if [[ $STRING1 = *substr* ]]; then
echo Substring is present
fi
${var/pattern/replacement}
$var
pattern
置き換えられた値の最初の項目に展開されるksh引数拡張演算子replacement
。
最初の発生の場合も同様であり、置き換えられた${STRING1/substr/}
項目がないため削除されました。$STRING1
substr
[[ string = pattern ]]
[[ string != pattern ]]
文字列をパターンに一致させるために使用される別のksh関連の設定です。パターンが引用されると、同等[[ string = "string" ]]
演算子(不等式も含む)と同様に文字通りと見なされます!=
。
したがって、コマンドは、[[ $STRING1 != "${STRING1/substr/}" ]]
拡張が別の文字列を生成し、内部が少なくとも1回発生した場合にのみ発生する場合はtrueを返すため、これが含まれていることを確認する方法です。$STRING1
${STRING!/substr/}
substr
$STRING1
$STRING1
substr
とどちらも標準構文で[[...]]
はありませんが、コマンドと演算子(後者もkshに由来)は標準構文です。したがって、時には次のコードが表示されます。${var/pattern/replacement}
sh
[
${var#pattern}
if [ "$STRING1" != "${STRING1#*substr*}" ]; then
echo Substring is present
fi
これは変数に部分文字列が含まれていることを確認する標準(Bourneではありません)方法ですが、複雑で明白なステートメントアプローチに比べてcase
利点はありません。
答え2
部分文字列が含まれていることを確認してください。
実装しやすくなりそうです。
[ -z "${s##*substr*}" ] && echo Substring is present
存在する場合、拡張結果${…}
はnull(長さ0)です。substr
... if文の条件はどのように機能しますか?これ
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
2つの文字列が比較されています。変更されていない元の文字列とsubstr
削除された同じ文字列(/substr/}
)。異なる場合は、元の!=
文字列にが含まれますsubstr
。