如何在Bash脚本中遍历指定的命令行参数?
问题分析与解决
你的脚本存在两个核心问题:
getopts无法直接捕获多值选项:getopts默认只会把选项后的第一个参数作为OPTARG,执行-s Sample1 Sample2 Sample3时,只有Sample1被赋值给samples,剩下的Sample2 Sample3会被当成未处理的位置参数,根本没进入samples变量。echo语法错误:你连续写了两个echo命令,第二个echo会被当成第一个echo的参数输出,所以才会出现Sample1 echo的异常结果。
修正后的脚本
#!/bin/bash # 用数组存储样本,避免带空格的样本名被错误拆分 samples=() parameter="" # 处理命令行选项,扩展-s的多值捕获逻辑 while getopts s:p: flag; do case "${flag}" in s) # 将当前OPTARG加入数组 samples+=("${OPTARG}") # 循环读取后续参数,直到遇到下一个以-开头的选项 while [[ $((OPTIND)) -le $# && ! "${!OPTIND}" =~ ^- ]]; do samples+=("${!OPTIND}") ((OPTIND++)) done ;; p) parameter="${OPTARG}";; esac done # 遍历样本数组输出内容 for sample in "${samples[@]}"; do echo "$sample $parameter" done
执行效果
运行bash script.sh -s Sample1 Sample2 Sample3 -p test,会得到你期望的输出:
Sample1 test Sample2 test Sample3 test
关键说明
- 用数组存储
samples:相比普通字符串变量,数组能安全保存带空格的样本名(比如Sample A这类),避免被shell错误拆分。 - 扩展
getopts处理逻辑:捕获-s的第一个参数后,继续检查后续参数,只要不是以-开头的选项,就加入数组,直到遇到下一个命令行选项(比如-p)。 - 修正
echo写法:将两个echo合并为一个,直接输出两个变量的内容。
内容的提问来源于stack exchange,提问作者Billy Mills
相关产品推荐
相关产品推荐

