当“getopts”遇到“--”时,它的行为是什么?

当“getopts”遇到“--”时,它的行为是什么?

按照惯例,--这表示此后没有更多选项。在我看来,当使用getoptswithcase子句时,-)模式子句不匹配--。那么getopts它相遇时的行为是什么--?它是否将其--视为选项、非选项参数,或者两者都不是?谢谢。

答案1

行为是它停止解析命令行并保留其余参数不变。它--本身被删除(或者更确切地说,$OPTIND将表明它已被处理,但$opt在下面的代码中永远不会被处理-,如果您shift "$(( OPTIND - 1 ))"通常这样做,您将永远不会看到它)。

例子:

#!/bin/bash

while getopts 'a:b:' opt; do
    case "$opt" in
        a)  printf 'Got a: "%s"\n' "$OPTARG" ;;
        b)  printf 'Got b: "%s"\n' "$OPTARG" ;;
        *)  echo 'error' >&2
            exit 1
    esac
done

shift "$(( OPTIND - 1 ))"

printf 'Other argument: "%s"\n' "$@"

运行它:

$ bash script.sh -a hello -- -b world
Got a: "hello"
Other argument: "-b"
Other argument: "world"

正如您所看到的,-b world命令行的位没有被 处理getopts

--它在第一个非选项参数处或第一个非选项参数处停止解析命令行:

$ bash script.sh something -a hello -- -b world
Other argument: "something"
Other argument: "-a"
Other argument: "hello"
Other argument: "--"
Other argument: "-b"
Other argument: "world"

在这种情况下,--不是“删除”因为从来getopts没有走到这一步。

相关内容