この質問にはすでに回答があります :複数行の文字列の最後の行に指定されたパターンが含まれているかどうかのシェルテスト
(3つの回答)
3年前に閉鎖されました。
Linux
(3つの回答)
3年前に閉鎖されました。
では、なぜ次のように機能するのでしょうか。つまり、一致を出力します。
THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
echo "Match!"
fi
しかし、以下はそうではありません:
if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
echo "Match!"
fi
違いはなんですか?同じ正規表現です
承認された回答:
[[
内で一重引用符を使用しないでください :
if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
echo "Match!"
fi
GNU bashマニュアルから:https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs
特に注意してください:
パターンの任意の部分を引用して、引用部分を文字列として強制的に一致させることができます 。
マニュアルでは、変数の使用を推奨しているようです:
正規表現をシェル変数に格納することは、シェルに固有の文字を引用する際の問題を回避するための便利な方法であることがよくあります。引用符を使用せずに正規表現を文字通り指定したり、シェルの引用符の削除に注意しながら正規表現で使用された引用符を追跡したりすることが難しい場合があります。シェル変数を使用してパターンを格納すると、これらの問題が軽減されます。