Bashの正規表現が変数の場合にのみ機能し、直接機能しないのはなぜですか? [コピー]

Bashの正規表現が変数の場合にのみ機能し、直接機能しないのはなぜですか? [コピー]

もしそうなら、なぜそれがうまくいき、一致を印刷するのですか?

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  

違いは何ですか?これは同じ正規表現です。

答え1

内部に一重引用符を使用しないでください[[

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

注意:

パターンのすべての部分を引用して、引用された部分を文字列に一致させることができます。

マニュアルでは、この変数を最初に使用することをお勧めします。

シェル変数に正規表現を格納することは、シェル固有の文字を引用するときに問題を回避する便利な方法であることがよくあります。場合によっては、引用符を使用せずに正規表現を文字通り指定したり、シェルの引用符の削除に注意しながら、正規表現で使用されている引用符を追跡することは困難です。シェル変数を使用してパターンを保存すると、これらの問題を軽減できます。

また、見ることができますシェル変数に正規表現を格納してシェル固有の文字を引用する問題を回避するには?

関連情報