GNU/Linux >> Linux の 問題 >  >> Linux

Bashの正規表現が変数であり、直接ではない場合にのみ機能するのはなぜですか?

この質問にはすでに回答があります :複数行の文字列の最後の行に指定されたパターンが含まれているかどうかのシェルテスト

(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

特に注意してください:

パターンの任意の部分を引用して、引用部分を文字列として強制的に一致させることができます

マニュアルでは、変数の使用を推奨しているようです:

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


Linux
  1. pushdとpopdを使用してBashシェルをナビゲートする

  2. Bashシェルのカスタマイズ

  3. 組み込みコマンドとそうでないコマンドの違いは?

  1. .bashrcの目的とそれはどのように機能しますか?

  2. [a-z]がBashの小文字と一致するのはなぜですか?

  3. Bash翻訳ファイルにすべてのエラーテキストが含まれていないのはなぜですか?

  1. / bin/shが/bin/bashではなく/bin/ dashを指すのはなぜですか?

  2. bashの&>と>&の違いは何ですか?

  3. Bash(Linux シェル)で Ctrl + V が貼り付けられないのはなぜですか?