web-dev-qa-db-ja.com

なぜ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  

違いはなんですか?同じ正規表現です

2
Jim

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

if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
    echo "Match!"
fi

GNU bash manual: https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs から

特に注意してください:

パターンの任意の部分を引用符で囲んで、引用符で囲まれた部分を文字列として一致させることができます

マニュアルは変数を使用することを推奨するようです:

シェル変数に正規表現を格納することは、多くの場合、シェルに特有の文字の引用に関する問題を回避するのに役立つ方法です。引用符を使用せずに文字どおりに正規表現を指定したり、シェルの引用の削除に注意しながら正規表現で使用されている引用を追跡したりするのは難しい場合があります。シェル変数を使用してパターンを格納すると、これらの問題が減少します。

参照 シェル変数に正規表現を格納すると、シェルに特有の文字を引用する際の問題がどのように回避されますか?

8
jw013