Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用不同的Shell得到非常不同的getopts结果_Bash_Shell_Posix_Zsh_Dash Shell - Fatal编程技术网

Bash 使用不同的Shell得到非常不同的getopts结果

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' " }

我在一个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' "
}
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'