文字列があり、ここに部分文字列が含まれていることを確認したいと思います。だから私はこのコマンドを使用しています。以下は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
利点はありません。