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

Bash变量存储正则表达式传递给grep出现找不到文件错误如何解决

问题根因

报错由Bash的单词拆分机制和变量冗余内容共同导致:

  • 直接书写正则时,外层单引号会阻止Bash拆分内容,整个正则作为单个参数传给grep,运行正常
  • 调用变量时未加双引号包裹,Bash会按空格将正则切割为多个独立参数,grep将第一个参数作为匹配模式,后续参数都识别为待读取的文件名,因此抛出「No such file or directory」错误
  • 你的变量定义额外把用作Shell引用的单引号存入了变量值中,这部分单引号不属于正则本身的内容,直接传递也会导致匹配失败

无需调整单引号嵌套的解决方案

如果你完全不想修改现有变量定义的单引号嵌套结构,只需要在调用grep时给变量扩展加双引号阻止单词拆分,同时截断变量首尾多余的单引号即可:

# 原变量定义无需任何修改
VALID_MODELINE_FMT=$'\'"[0-9]+x[0-9]+@[0-9]+" ([0-9]+)(\.[0-9]+)?( [0-9]+){8} [+|-]hsync [+|-]vsync\''
# 调用时加双引号,同时去除首尾多余的单引号
REJECTED_MODELINES=$(printf "$MODELINES_STR" | grep -vE "${VALID_MODELINE_FMT:1:-1}")

更易维护的优化方案(可选)

如果后续可以调整变量定义,更推荐直接用单引号包裹正则内容(无需额外嵌套转义),调用时加双引号即可,代码可读性更高:

# 单引号内除单引号本身外所有字符原样保留,不需要额外转义嵌套
VALID_MODELINE_FMT='"[0-9]+x[0-9]+@[0-9]+" ([0-9]+)(\.[0-9]+)?( [0-9]+){8} [+|-]hsync [+|-]vsync'
# 必须加双引号包裹变量,阻止单词拆分
REJECTED_MODELINES=$(printf "$MODELINES_STR" | grep -vE "$VALID_MODELINE_FMT")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:36:01