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

如何在Bash脚本中遍历指定的命令行参数?

问题分析与解决

你的脚本存在两个核心问题:

  1. getopts无法直接捕获多值选项:getopts默认只会把选项后的第一个参数作为OPTARG,执行-s Sample1 Sample2 Sample3时,只有Sample1被赋值给samples,剩下的Sample2 Sample3会被当成未处理的位置参数,根本没进入samples变量。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:31:04