如何从含转义引号的文件中提取命令行参数?
解决方案:拆分含转义引号的命令行参数
Python 实现(Bash 中调用)
Python 的 shlex 模块专门用于解析类 Shell 的命令行参数,能正确识别转义引号和引号内的空格。在 Bash 中可以通过以下方式调用:
# 读取 argsfile 内容并拆分,生成 Bash 数组 args=($(python3 -c 'import shlex, sys; print("\n".join(shlex.split(sys.stdin.read())))' < argsfile)) # 验证拆分结果 for arg in "${args[@]}"; do echo "数组元素: '$arg'" done
执行后,args 数组的内容会是:['-e', 'my_var="this string has spaces"', '-e', 'my_var2="this one too"'],完全符合需求。
Perl 实现(Bash 中调用)
Perl 的 Text::ParseWords 模块提供了 shellwords 函数,同样可以精准解析带转义引号的参数:
# 读取 argsfile 内容并拆分,生成 Bash 数组 args=($(perl -MText::ParseWords -e 'print join("\n", shellwords(<STDIN>))' < argsfile)) # 验证拆分结果 for arg in "${args[@]}"; do echo "数组元素: '$arg'" done
该方法的输出结果与 Python 方案一致,能正确保留引号内的空格并忽略转义引号。
为什么之前的方法失效?
grep -Eo "\S+|'.*'|\".*\""采用贪婪匹配,会把第一个双引号后的所有内容(包括后续的-e和第二个参数)当作单个元素,无法识别转义引号的边界。- awk 的 FPAT 若未针对转义引号做特殊处理,会错误地将转义后的引号视为字段结束符;xargs 默认的拆分逻辑也不支持转义引号的解析,导致拆分结果不符合预期。
内容的提问来源于stack exchange,提问作者Lauren Minnema
相关产品推荐
相关产品推荐

