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
相关产品推荐
相关产品推荐

