如何编写并调用脚本生成含空格的命令行参数供外部程序使用?
解决带空格的命令行参数生成与传递问题
方法1:用NUL分隔参数(最安全)
修改你的generate脚本,让每个参数以NUL字符(\0)结尾输出——NUL是唯一不会出现在合法参数里的字符,能彻底避免空格、引号等特殊字符的干扰。
比如generate脚本里输出参数的部分改成:
printf '%s\0' "First argument with spaces" "Second argument with spaces"
然后调用时用readarray读取到数组,再传递给外部程序:
readarray -d '' args < <(generate arguments) external_program "${args[@]}"
方法2:转义参数后用eval(适合可控场景)
如果generate脚本的输出完全由你控制(无恶意内容),可以让脚本输出经过转义的参数,再用eval解析。
修改generate脚本,用printf %q转义每个参数:
printf '%q ' "First argument with spaces" "Second argument with spaces"
调用时直接用eval执行拼接后的命令:
eval "external_program $(generate arguments)"
注意:如果
generate的输出可能包含不可信内容,eval会有安全风险,谨慎使用。
方法3:直接定义bash数组(最直观)
把generate脚本改成直接在当前shell环境中定义一个数组变量,调用时通过source加载这个数组。
generate脚本内容示例:
#!/bin/bash # 根据输入的arguments生成参数数组 args=( "First argument with spaces" "Second argument with spaces" )
调用方式:
source generate arguments external_program "${args[@]}"
为什么原来的写法失效?
原来的external_program $(generate arguments)会触发bash的分词机制:命令替换的输出会被按空格、制表符、换行符拆分成多个参数,不管输出里的引号——所以带空格的参数会被拆成好几段,自然不符合预期。
内容的提问来源于stack exchange,提问作者gerum
相关产品推荐
相关产品推荐

