Bash

為什麼 bash 中的正則表達式僅在它是變數而不是直接的情況下才有效?

  • March 16, 2018

那麼為什麼以下工作,即列印出比賽:

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

特別注意:

可以引用模式的任何部分以強制將引用的部分匹配為字元串

該手冊似乎建議首選使用該變數:

將正則表達式儲存在 shell 變數中通常是避免引用 shell 特殊字元問題的有用方法。有時很難在不使用引號的情況下從字面上指定正則表達式,或者在註意 shell 的引號刪除時跟踪正則表達式使用的引號。使用 shell 變數來儲存模式可以減少這些問題。

另請參閱如何將正則表達式儲存在 shell 變數中避免引用 shell 特殊字元的問題?

引用自:https://unix.stackexchange.com/questions/430631