Bash 使用不同的Shell得到非常不同的getopts结果
我在一个shell脚本中进行了一些选项解析,该脚本将内置于Bash 使用不同的Shell得到非常不同的getopts结果,bash,shell,posix,zsh,dash-shell,Bash,Shell,Posix,Zsh,Dash Shell,我在一个shell脚本中进行了一些选项解析,该脚本将内置于dash和bash,我在bash中得到了一些奇怪的结果,因此我将脚本的精髓放在: /选择: fn() { local verbose opt while getopts "v" opt; do case "$opt" in v) verbose=1;; ?) return 1;; esac done; shift $((OPTIND - 1)) echo -n "'$verbose' " }
dash
和bash
,我在bash
中得到了一些奇怪的结果,因此我将脚本的精髓放在:
/选择:
fn()
{
local verbose opt
while getopts "v" opt; do
case "$opt" in v) verbose=1;; ?) return 1;; esac
done; shift $((OPTIND - 1))
echo -n "'$verbose' "
}
fn -v; fn -v; fn -v; printf '\n'
并使用不同的(local
-支持)shell运行此命令:
我得到的结果是:
SH=bash
'1' '' ''
SH=dash
'1' '1' '1'
SH=posh
'1' '' '1'
SH=zsh
'1' '1' '1'
这些差异的原因是什么?
bash
和posh
或我的脚本有问题吗?您需要在getopts
循环之前将OPTIND
设置回1
,因此它将从第一个参数开始
在bash
中,OPTIND
仅在脚本启动时自动初始化,在zsh
和dash
中,它在输入函数时初始化,从函数返回时恢复为其旧值。我不知道波什做什么
根据
zsh
文档,您可以通过设置POSIX_BUILTINS
选项使其与bash
类似。从名称来看,我假设bash
行为与POSIX要求一致,zsh
和dash
相互冲突。您需要在getopts
循环之前将OPTIND
设置回1
,因此它将从第一个参数开始
在bash
中,OPTIND
仅在脚本启动时自动初始化,在zsh
和dash
中,它在输入函数时初始化,从函数返回时恢复为其旧值。我不知道波什做什么
根据zsh
文档,您可以通过设置POSIX_BUILTINS
选项使其与bash
类似。从名称来看,我假设bash
行为与POSIX要求一致,zsh
和dash
是冲突的
SH=bash
'1' '' ''
SH=dash
'1' '1' '1'
SH=posh
'1' '' '1'
SH=zsh
'1' '1' '1'