0

每当我使用 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
;;
4

1 回答 1

2

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

那说。. .

要实现可选选项参数的某些效果,您可以通过在选项字符串的开头getopts放置一个冒号来告知要“静默”(即使用“静默错误报告”) 。:(例如,而不是getopts d: ...,你会写getopts :d: ...。)然后,当一个选项的参数丢失时,它会将选项名称设置为:(而不是d)和OPTARG选项名称(即d,而不是选项参数)。

例如,下面的脚本可以被称为 asscript.sh -d foo或 as 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
于 2013-10-05T20:44:12.740 回答