2013-10-05 47 views
0

每当我使用getopts的,我不给任何参数对于给定的标志,我得到了以下信息:"option requires an argument -- d"改变getopts的无参数默认情况下 - 庆典

我想删除此消息,并允许用户使用read命令重新输入选项。

这是我的getopts的情况下:

if [ $# -lt $OPTIND ]; then 
    echo "Option -d argument missing: needs 2 args" 
    echo "Please enter two args: <arg1> <arg2>" 
    read d_ID d_SIZE 
    echo "disc $d_ID $d_SIZE" >> $FILENAME 
else 
    d_ID=$OPTARG 
    eval d_SIZE=\$$OPTIND 
    echo "disc $d_ID $d_SIZE" >> $FILENAME 
fi 
;; 

回答

2

我想你想要的行为是一个坏主意;有一些程序可以选择带有可选参数的选项,并且它们不会像你所描述的那样工作。你的方法可能会混淆你的用户;它会使其他程序难以与之互操作;它会限制脚本未来的可扩展性。 (想象一下,你想以后添加另一种选择。your_script.sh -d -e将通过-e作为参数传递给-d,即使用户想使用-d不带参数,并打算-e作为一个单独的选项。),并期望它是特别奇怪的一个参数如果它在命令行上,但是两个参数来自标准输入。

这就是说。 。 。

要获得某个可选选项参数的某些效果,可以通过在选项字符串的开头放置冒号:来指示getopts为“无声”(即,使用“无提示错误报告”) 。 (例如,代替getopts d: ...,则会编写getopts :d: ...。)然后,如果缺少选项的参数,则会将选项名称设置为:(而不是d)和OPTARG作为选项名称(即d,而不是选项参数)。

例如,下面的脚本可以被称为或者作为script.sh -d foo或作为script.sh -d,后者使用户被提示输入一个值:

#!/bin/bash 

if getopts :d: arg ; then 
    if [[ "$arg" == d ]] ; then 
     d="$OPTARG" 
    else 
     read -p 'Enter d: ' d 
    fi 
    echo "d is: $d" 
else 
    echo 'no d' 
fi 

在所得:

$ ./script.sh 
no d 

$ ./script.sh -d 
Enter d: x 
d is: x 

$ ./script.sh -d y 
d is: y