如何在Bash脚本中传递带空格的字符串参数并保持完整性
解决Bash脚本传递含空格字符串参数的完整性问题
其实你写的"${@}"本身就是正确的写法呀!之所以你觉得参数被拆分了,大概率是被echo的输出误导了——echo "${@}"会把所有参数用空格拼接起来输出,但这并不代表参数实际被拆分了。
我们来用一个更直观的测试验证一下:
- 写一个测试脚本
test_args.sh:
#!/usr/bin/env bash echo "总共有 $# 个参数" # 逐个打印每个参数,用单引号包裹就能看到每个参数的边界了 for idx in $(seq 1 $#); do echo "第 $idx 个参数: '${!idx}'" done # 再模拟你原来的执行逻辑,观察参数传递情况 exec echo /path/to/code.py "${@}"
- 执行
./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
相关产品推荐
相关产品推荐

