让x='abc.xyz'
和y='abc:xyz'
以便以下成立(打印“匹配”和“差异”):
[[ "${x}" =~ abc".xyz" ]] && echo "matches"
[[ "${y}" =~ abc".xyz" ]] || echo "diff"
现在,可以提取文字l=".xyz"
并且测试仍然有效(请注意l
引号周围的双引号):
[[ "${x}" =~ abc"${l}" ]] && echo "matches"
[[ "${y}" =~ abc"${l}" ]] || echo "diff"
问题是:如果我们进一步尝试r="abc\"${l}\""
或r="abc${l}"
,第一次测试就不会打印“匹配”:
[[ "${x}" =~ ${r} ]] && echo "matches"
[[ "${y}" =~ ${r} ]] || echo "diff"
通过两项测试的r
的正确形式应该是什么?
答案 0 :(得分:1)
shell通常从命令行中删除所有未加引号的"
(它们控制
只有当参数应该被拆分时才会被拆分)
是=~
之后的特殊处理。引号在这里像逃脱一样工作,
引号之间的所有内容都只作为匹配的原始字符处理
本身(除了仍然有效的$
变量替换)。
只有一种评估模式,因此引用 隐藏在变量中被视为常规引号,并且可以 不会触发特殊引用语法。
您需要转义.
中的$l
(或任何其他有效)字符
并且引用语法在变量中不起作用。
如果$l
始终等于.xyz
,您可以使用r="abc\\${l}"
来获得正确的匹配。
它等于r='abc\.xyz'
。