$STRING1 != Linuxの "${STRING1/substr/}"

$STRING1 != Linuxの

文字列があり、ここに部分文字列が含まれていることを確認したいと思います。だから私はこのコマンドを使用しています。以下は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}$varpattern置き換えられた値の最初の項目に展開されるksh引数拡張演算子replacement

最初の発生の場合も同様であり、置き換えられた${STRING1/substr/}項目がないため削除されました。$STRING1substr

[[ string = pattern ]][[ string != pattern ]]文字列をパターンに一致させるために使用される別のksh関連の設定です。パターンが引用されると、同等[[ string = "string" ]]演算子(不等式も含む)と同様に文字通りと見なされます!=

したがって、コマンドは、[[ $STRING1 != "${STRING1/substr/}" ]]拡張が別の文字列を生成し、内部が少なくとも1回発生した場合にのみ発生する場合はtrueを返すため、これが含まれていることを確認する方法です。$STRING1${STRING!/substr/}substr$STRING1$STRING1substr

とどちらも標準構文で[[...]]はありませんが、コマンドと演算子(後者もkshに由来)は標準構文です。したがって、時には次のコードが表示されます。${var/pattern/replacement}sh[${var#pattern}

if [ "$STRING1" != "${STRING1#*substr*}" ]; then
  echo Substring is present
fi

これは変数に部分文字列が含まれていることを確認する標準(Bourneではありません)方法ですが、複雑で明白なステートメントアプローチに比べてcase利点はありません。

おすすめ記事