我有一个脚本:
#!/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
选项不会将下一个选项作为其参数。然而,这是不希望的,因为它允许选项未设置;不是我想要的。
那么,我的问题是:是否有可能确保所有提供的选项都有参数,如果没有提供参数,那些参数不是下一个选项?如果是这样,怎么样?
答案 0 :(得分:0)
这是问题,因为getopt
也接受加入的参数,例如对于以下
getopts ":i:v:xyz"
将接受
getopts -xyz
并且$opt
会偶然设置为x
y
和z
。对于需要值的参数,也接受以下内容 - 例如-i
script -iwww
e.g。不需要空格 - $OPTARG
将设置为www
。因此,以下也被接受
script -xyiwww
什么设置,x
,y
和i
与$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;是有效的输入。鉴于您的输入有一些要求,我建议您进行输入验证。你可以做一些令人讨厌的/智能输入验证,检查参数是否看起来像一个选项标志,但通常最好检查输入是否遵循预期的模式或给定的文件是否存在等。