bash脚本中sed匹配用户输入Bacula Job名无输出如何解决
问题原因
- 核心故障点是Bash的单引号特性:所有被单引号
'包裹的内容,Bash不会做任何变量展开、特殊字符转义处理,会直接将内容作为字面量传递给调用的程序。 - 你脚本中的sed命令使用单引号包裹匹配规则,
/$job_name/中的$job_name变量不会被替换为用户输入的实际值,sed实际是在配置文件中搜索包含字面量$job_name的行,自然匹配不到任何内容,所以输出为空。 - 你在命令行硬编码Job名称时不需要变量展开,所以能正常执行;添加
-e参数无法解决问题,因为故障点和sed执行参数无关,是变量未正确传递的问题。你可以从脚本的debug输出验证这一点:sed实际执行的命令里依旧是/$job_name/,没有被替换为你输入的testbox_db_weekly。
解决方法
将sed命令的匹配规则从单引号包裹改为双引号包裹,让Bash可以先完成变量展开再将规则传递给sed,修改后的脚本对应行如下:
job_output=$(sed -n "/$job_name/,/^}/p" bacula-dir.conf)
上述写法会从匹配到Job名称的行开始,到第一个以}开头的行为止,输出所有匹配的内容,符合你提取完整Job配置块的需求。
如果需要兼容Job名称包含/等特殊字符的场景,可以更换sed的正则分隔符避免冲突,示例如下:
job_output=$(sed -n "\#$job_name#,/^}/p" bacula-dir.conf)
内容的提问来源于stack exchange,提问作者anji
相关产品推荐
相关产品推荐

