You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash脚本中传递带空格的字符串参数并保持完整性

解决Bash脚本传递含空格字符串参数的完整性问题

其实你写的"${@}"本身就是正确的写法呀!之所以你觉得参数被拆分了,大概率是被echo的输出误导了——echo "${@}"会把所有参数用空格拼接起来输出,但这并不代表参数实际被拆分了。

我们来用一个更直观的测试验证一下:

  1. 写一个测试脚本test_args.sh:
#!/usr/bin/env bash
echo "总共有 $# 个参数"
# 逐个打印每个参数,用单引号包裹就能看到每个参数的边界了
for idx in $(seq 1 $#); do
    echo "第 $idx 个参数: '${!idx}'"
done
# 再模拟你原来的执行逻辑,观察参数传递情况
exec echo /path/to/code.py "${@}"
  1. 执行./test_args.sh -arg "A string",你会得到这样的输出:
总共有 2 个参数
第 1 个参数: '-arg'
第 2 个参数: 'A string'
/path/to/code.py -arg A string

看到没?虽然最后一行的echo输出里A string没有引号,但实际上它是作为单个参数传递的——前面的参数计数和逐个打印已经明确证明了这一点。引号只是Bash用来标记参数边界的语法,当参数传递给程序时,引号本身不会被传递,程序收到的就是完整的A string作为一个参数。

那为什么你的my_program会报错说unrecognized arguments: string?大概率是你误解了错误的来源,或者my_program本身的参数处理逻辑有问题?比如如果是Python脚本用argparse处理参数,只要你在Bash脚本里正确传递了"${@}",Python会把-arg和A string当成两个独立的参数,绝不会拆分A string。

总结一下,你的原始脚本写法是完全正确的:

#!/usr/bin/env bash
exec my_program /path/to/code.py "${@}"

执行my_script -arg "A string"时,my_program收到的参数列表是:/path/to/code.py、-arg、A string,完全符合你的预期。

内容的提问来源于stack exchange,提问作者Ray Barrett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:50:39