使用getopt时单个选项能否传入两个参数值?
单个选项传多参数的合理性说明
- 按照传统Unix命令行设计惯例,单个选项默认仅支持0个(开关类选项)或1个入参,单选项直接传入2个参数的设计不符合通用使用习惯,会提升用户的理解成本,非特殊场景不推荐使用。
- 你测试时看到
21被识别到--之后的位置参数区,是getopt的默认逻辑:带参选项只会绑定紧随其后的第一个非选项参数,剩余未匹配的参数都会归为位置参数。
getopt实现方案
如果确实需要实现单选项接两个参数的逻辑,可以在解析getopt返回结果时,主动多读取一个位置参数,参考示例代码:
#!/bin/bash shortopts="S:" longopts="" # 处理getopt解析结果 opts=$( getopt -o "$shortopts" -l "$longopts" -n "${0##*/}" -- "$@" ) if [ $? -ne 0 ]; then exit 1 fi eval set -- "$opts" # 初始化参数存储变量 s_val1="" s_val2="" while true; do case "$1" in -S) s_val1="$2" # 主动读取下一个位置参数作为第二个值,注意做边界校验 if [ -z "$3" ] || [[ "$3" == "--" ]]; then echo "错误:-S选项需要传入2个参数" >&2 exit 1 fi s_val2="$3" # 因为多拿了一个参数,所以要多shift一次 shift 3 ;; --) shift break ;; *) echo "未知选项:$1" >&2 exit 1 ;; esac done echo "-S选项的两个参数分别为:$s_val1、$s_val2" echo "剩余位置参数为:$*"
测试执行./myfunc -S 13 21 otherarg,输出结果为:
-S选项的两个参数分别为:13、21 剩余位置参数为:otherarg
注意:该实现存在缺陷,若用户在第一个参数后输入其他选项,会被误识别为第二个参数,比如执行./myfunc -S 13 -h,-h会被判定为-S的第二个参数,不会触发帮助逻辑,兼容性较差。
更推荐的替代方案
优先选择符合通用惯例的实现方式,规避上述问题:
- 方式1:用引号将两个值包裹为单个参数,后续自行拆分:
./myfunc -S "13 21" - 方式2:重复使用同一选项传入多个值:
./myfunc -S 13 -S 21 - 方式3:用分隔符拼接多个值:
./myfunc -S 13,21
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

