$OPTIND
在POSIX shell和bash中的定义非常一致且直观 - 它是下一个要读取的参数的索引。但是,在zsh
中它的行为相当令人困惑,我找不到相关的文档说明。示例:
# ./test.sh:
foo() {
while getopts "1:2:34:" flag; do
echo flag: $flag
echo arg: $OPTARG
echo ind: $OPTIND
done &&
echo .
}
foo -1 1 -2 2 -3 3 -4 4
现在执行:
>>> sh ./test.sh
flag: 1
arg: 1
ind: 3
flag: 2
arg: 2
ind: 5
flag: 3
arg:
ind: 6 <<<< EXPECTED - next arg should be $6
.
>>> bash ./test.sh
flag: 1
arg: 1
ind: 3
flag: 2
arg: 2
ind: 5
flag: 3
arg:
ind: 6 <<<< EXPECTED - next arg should be $6
.
>>> zsh ./test.sh
flag: 1
arg: 1
ind: 3
flag: 2
arg: 2
ind: 5
flag: 3
arg:
ind: 5 <<<<<< NOTICE HERE
.
这是在 zsh 5.3.1 (amd64-portbld-freebsd11.0)
上测试的。
OPTIND-1
移到循环末尾并不是使用getopts
的唯一方法,只是一个常用的模式。因此,在使用OPTIND的其他情况下,我对原始问题的担忧仍然存在,除非这种行为被更清楚地理解。 - KFLgetopts
仍然不可靠。我使用了while循环代替getopts
。 - t7e