那么为什么下面的工作会打印出匹配项:
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
特别注意:
模式的任何部分都可以被引用以强制引用部分作为字符串进行匹配。
该手册似乎建议首选使用该变量:
将正则表达式存储在 shell 变量中通常是避免引用 shell 特有字符时出现问题的有用方法。有时很难在不使用引号的情况下按字面指定正则表达式,或者在注意 shell 的引号删除的同时跟踪正则表达式使用的引号。使用 shell 变量来存储模式可以减少这些问题。