【问题标题】:Very different getopts results with different shells使用不同的 shell 会产生非常不同的 getopts 结果
【发布时间】:2017-12-07 05:45:01
【问题描述】:

我在一个打算在dashbash内包的shell脚本中做了一些选项解析,在bash得到了一些奇怪的结果,所以我把脚本的精髓放在了:

./getopts :

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-supporting) shell 运行它:

for sh in bash dash posh zsh; do echo SH=$sh; $sh ./getopts; done

我得到的结果是:

SH=bash
'1' '' '' 
SH=dash
'1' '1' '1' 
SH=posh
'1' '' '1' 
SH=zsh
'1' '1' '1' 

造成这些差异的原因是什么?是bashposh 还是我的脚本有问题?

【问题讨论】:

    标签: bash shell posix zsh dash-shell


    【解决方案1】:

    您需要在getopts 循环之前将OPTIND 设置回1,因此它将从第一个参数开始。

    bash中,OPTIND仅在脚本启动时自动初始化,在zshdash中,它在进入函数时初始化,并在从函数返回时恢复为旧值。我不确定posh 做了什么。

    根据zsh 文档,您可以通过设置POSIX_BUILTINS 选项使其行为类似于bash。从名称来看,我假设bash 的行为符合POSIX 要求,而zshdash 存在冲突。

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      相关资源
      最近更新 更多