You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash正则表达式中正确使用引号?

解决Bash正则表达式引号冲突问题

你的问题核心是Bash中[[ =~ ]]正则匹配的引号规则和字符类内引号转义的冲突。以下是两种可行的解决方式:

方式一:使用ANSI-C引号定义正则变量

Bash的ANSI-C引号($'')支持正确转义特殊字符,能避免单双引号的语法冲突。把正则重新定义为:

REGEX=$'^\\s*-.*|^\\s*file:\\s*["\'].*'
if [[ ${LINE} =~ ${REGEX} ]]; then
  # TODO
fi
  • $''会自动解析内部的转义序列,这里\\s保持正则的空白匹配,["\']明确匹配双引号或单引号
  • 注意去掉原代码中${REGEX}后面多余的.*,因为正则本身已经包含.*结尾,重复添加会冗余

方式二:直接将正则写入匹配语句

如果不需要复用正则,直接把正则写在[[ =~ ]]内,省去变量定义的麻烦:

if [[ ${LINE} =~ ^\s*-.*|^\s*file:\s*["\'].* ]]; then
  # TODO
fi
  • 这里的["\']在无引号包裹的正则中,Bash会正确识别为字符类,匹配双引号或单引号

补充说明

原代码在Windows Bash正常是因为Windows环境下的Bash对引号解析的宽松性,但shellspec作为测试工具,对语法规范要求更严格,所以暴露了引号未正确转义的问题。Bash官方建议在[[ =~ ]]中不要给正则加引号,是因为加引号后正则会被当作普通字符串匹配,而非正则表达式,所以必须保证无引号的正则语法正确。

内容的提问来源于stack exchange,提问作者floriandev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:03:23