Bash如何传递单个字符串形式的多参数并支持可变参数解析
解决方案
核心是利用Bash的数组和特殊位置变量$@处理可变长度参数,不需要为不同长度的参数单独写脚本。
最优写法(无解析风险)
不要把整行参数作为单个字符串传入封装脚本,读取文件时直接把每行拆分为参数数组,再完整透传给封装脚本,从根源避免字符串拆分的各种坑。
- 修改外层循环逻辑:
这里while read -r -a args_array; do launchmyprogram.sh "${args_array[@]}" done < test.txtread -a会自动把每行按空格分割存入数组args_array,"${args_array[@]}"会把数组元素展开为独立的传入参数,和手动写'var1' 'var2'的效果完全一致。 - 编写
launchmyprogram.sh:
Bash里的#!/bin/bash myprogram -args "$@""$@"是特殊变量,代表所有传入脚本的位置参数,不管传了多少个都能原样透传,天然适配可变长度参数。 - 给脚本加执行权限:
chmod +x launchmyprogram.sh
兼容现有调用逻辑的写法
如果你不想修改现有的外层循环,坚持把整行作为单个字符串传入封装脚本,就在脚本内部做拆分即可,launchmyprogram.sh内容如下:
#!/bin/bash read -r -a parsed_args <<< "$1" myprogram -args "${parsed_args[@]}"
注意:这种写法默认参数本身不含空格、是纯空格分隔格式,如果参数本身带空格需要引号包裹,优先选第一种写法。
验证方法
可以先写个测试脚本验证参数传递是否正确,新建myprogram写入以下内容:
#!/bin/bash echo "当前传入参数总个数:$#" idx=1 for arg in "$@"; do echo "第$idx个参数:$arg" idx=$((idx+1)) done
加执行权限后运行循环,就能看到每一行的参数都被正确拆分、按顺序传递,不会出现整行被识别为单个参数的问题。
内容的提问来源于stack exchange,提问作者je2018
相关产品推荐
相关产品推荐

