如何在Bash中将含空格的参数存入变量并正确传递?
Bash中带空格参数的变量存储与正确传递方法
在Bash脚本中,若要把包含带空格的参数(比如存入变量a的file name)打包到单个变量后传递给命令,直接用普通字符串变量会触发参数拆分错误——比如执行printArguments $b时,file name会被拆成两个独立参数。以下是几种可行的解决办法:
数组方案(推荐)
用数组存储参数,通过"${b[@]}"的方式可正确展开参数,避免拆分:
a="file name" b=("foo" "$a") printArguments "${b[@]}" # 输出:$1=»foo« $2=»file name«
注意:必须给${b[@]}加上双引号,直接写${b[@]}仍会触发参数拆分。
eval方案(谨慎使用)
eval可以解析变量中的引号,实现正确参数传递,但存在严重安全风险——如果变量内容不可控,可能会执行恶意命令:
a="file name" b='foo "$a"' eval "printArguments $b" # 输出:$1=»foo« $2=»file name«
bash -c方案(需注意安全)
通过导出函数和变量,再用bash -c执行命令,同样能实现参数正确传递,但也和eval一样存在安全隐患:
a="file name" export -f printArguments export a b='foo "$a"' bash -c "printArguments $b" # 输出:$1=»foo« $2=»file name«
另外需要注意空数组与空字符串的展开差异:
- 空数组
b=()用"${b[@]}"展开后,不会向命令传递任何参数 - 空字符串
b=""用"$b"展开后,会向命令传递一个空参数
内容的提问来源于stack exchange,提问作者Micha
相关产品推荐
相关产品推荐

