getopts 与第二个参数不匹配

getopts 与第二个参数不匹配

我正在尝试获取一个脚本来:

  • -q使用选项设置变量
  • 显示-h选项的帮助,以及
  • 其他选项失败-*,但允许位置参数

这是getopts我正在使用的片段:

while getopts qh opt; do
    case "${opt}" in
        q)
            quiet="true"
            ;;
        h)
            usage
            exit 1
            ;;
        \?)
            echo "unrecognized option -- ${OPTARG}"
            exit 1
            ;;
    esac
    shift
done

echo "unparsed: $*"

这看起来非常简单。但是,只有当我提供单个参数(a.sh -qa.sh -h执行预期的操作)时,它才有效。

但是,如果我提供两个参数,或者提供 $2 处无法识别的参数,它不会执行任何操作:

$ ./a.sh -b
unrecognized option -- b

$ ./a.sh -q -b
unparsed: -b

$ ./a.sh -h -k
this is my help message
unparsed: -k

知道为什么第二个参数 ($2) 没有在 getopts 循环中处理吗?

答案1

命令shift放错地方了。它应该是外部循环的while。尝试:

while getopts :qh opt; do
    case "${opt}" in
        q)
            quiet="true"
            ;;
        h)
            usage
            exit 1
            ;;
        \?)
            echo "unrecognized option -- ${OPTARG}"
            exit 1
            ;;
    esac
done
shift $((OPTIND - 1))

echo "unparsed: $*"

例子

如果我们将以下行添加到代码的开头:

usage() { echo "this is my help message"; }

然后我们可以做这些测试:

$ ./a.sh -q -foo
unrecognized option -- f
$ ./a.sh -q -h
this is my help message

相关内容