gpt4 book ai didi

shell - zsh `getopts` OPTIND 行为与其他 shell(bash、sh)不一致

转载 作者:行者123 更新时间:2023-12-04 08:58:52 24 4
gpt4 key购买 nike

$OPTIND 在POSIX shell 中的定义,bash 是相当一致和直观的——它是下一个要读取的arg 的索引。然而,它在 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的值。

重要的是处理完所有选项后的下一个参数:

以下结构对 bash 和 zsh 的工作方式相同:

# ./test.sh:
foo() {
local OPTIND flag
while getopts "1:2:34:" flag; do
echo flag: $flag
echo arg: $OPTARG
echo ind: $OPTIND
done
shift $(( OPTIND - 1 ))
echo "Next arg is $1"
}

foo -1 1 -2 2 -3 3 -4 4

始终在使用 getopts 的任何函数中包含 local OPTIND否则所有 getopts 共享一个全局 OPTIND

关于shell - zsh `getopts` OPTIND 行为与其他 shell(bash、sh)不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63661198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com