bash getopts中缺少参数会将参数设置为下一个选项

时间:2014-10-07 22:39:12

标签: bash getopts

我有一个脚本:

#!/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选项不会将下一个选项作为其参数。然而,这是不希望的,因为它允许选项未设置;不是我想要的。

那么,我的问题是:是否有可能确保所有提供的选项都有参数,如果没有提供参数,那些参数不是下一个选项?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:0)

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

getopts ":i:v:xyz"

将接受

getopts -xyz

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

script -iwww

e.g。不需要空格 - $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)以-开头,

会抛出错误,但这并不能解决上述“已加入”参数的问题... < / p>

因为我的英语不是最好的,所以我希望上面的内容有意义......

答案 1 :(得分:0)

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