【问题标题】:Missing argument in bash getopts sets argument to next optionbash getopts 中缺少参数将参数设置为下一个选项
【发布时间】:2014-10-07 22:39:11
【问题描述】:

我有一个脚本:

#!/bin/bash

i_flag=false
v_flag=false

while getopts ":i:v:" opt; do
  case $opt in
    i  ) i_flag=true; echo $OPTARG;;
    v  ) v_flag=true; echo $OPTARG;;
    \? ) echo Unknown option: -$OPTARG >&2; exit 1;;
    :  ) echo "Missing option argument for -OPTARG" >&2; exit 1;;
  esac
done

echo $i_flag
echo $v_flag

当我在不设置任何选项的情况下运行它时:

# ./opts_script.sh -i -v
-v
true
false

我希望看到的是两个选项的输出,表明没有传递任何参数。但是,-i 选项将-v 作为其参数并将i_flag 变量设置为true。然后它将 v_flag 变量保留为 false,因为它没有将其视为一个选项。

我还使用了while getopts ":iv:" opts; do,因此-i 选项不会将下一个选项作为其参数。然而,这是不希望的,因为它允许取消设置选项;不是我想要的。

因此,我的问题是:是否可以确保所有提供的选项都有参数,并且如果没有提供参数,这些参数不是下一个选项?如果有,怎么做?

【问题讨论】:

    标签: bash getopts


    【解决方案1】:

    这是个问题,因为 getopt 也接受加入的参数,例如对于以下

    getopts ":i:v:xyz"
    

    会接受

    getopts -xyz
    

    并且$opt 将依次设置为x yz。对于需要值的参数,也接受以下内容 - 例如您的 -i

    script -iwww
    

    例如不需要空间 - $OPTARG 将设置为 www。因此,也接受以下内容

    script -xyiwww
    

    什么设置,xyi$OPTARG = www

    由于上述原因,getopts 无法区分:

     script -iwww   #sets to the `$OPTARG` the string `www`
     #and
     script -iv     #set to the `$OPTARG` the string `v` altough the `-v` is an possible argument.
    

    可以通过一些工作对分离的参数进行一些检查,例如

    scrit -i -v
    

    如果$OPTARG(在本例中为-v)以- 开头会引发什么错误,但这并不能解决上述“加入”参数的问题...

    因为我的英语不是最好的,我希望上面说得通...

    【讨论】:

      【解决方案2】:

      如果你想让你的输入是任何东西“-v”是有效的输入。鉴于您的输入有一些要求,我建议您进行输入验证。你可以做一些讨厌的/聪明的输入验证检查参数是否看起来像一个选项标志,但通常最好检查输入是否遵循预期的模式或给定的文件是否存在等。

      【讨论】:

        猜你喜欢
        • 2018-03-04
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-29
        • 2011-11-23
        相关资源
        最近更新 更多