在getopts中更改no args默认情况 - bash

时间:2013-10-05 19:37:45

标签: bash getopts

每当我使用getopts并且我没有为给定的标志提供任何参数时,我收到以下消息:"option requires an argument -- d"

我想删除此消息,并允许用户使用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
;;

1 个答案:

答案 0 :(得分:2)

我认为你想要的行为是一个坏主意;存在使用可选参数获取选项的程序,它们与您描述的内容完全不同。您的方法可能会使您的用户感到困惑;它将使其他程序难以与之互操作;它将限制脚本未来的可扩展性。 (想象一下,您希望稍后添加其他选项。your_script.sh -d -e会将-e作为参数传递给-d,即使用户想要使用-d而没有任何参数和意图-e作为一个单独的选项。)如果一个参数在命令行上,但是两个参数来自标准输入,那么特别奇怪。

那就是说。 。

要实现可选option-argument的某些效果,可以通过放置冒号getopts来告诉:“静默”(即使用“无提示错误报告”)在选项字符串的开头。 (例如,代替getopts d: ...,您将编写getopts :d: ...。)然后,当缺少选项的参数时,它会将选项名称设置为:(而不是{{1} }}和d到选项名称(即OPTARG,而不是选项 - 参数)。

例如,可以将以下脚本调用为dscript.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