每当我使用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
;;
答案 0 :(得分:2)
我认为你想要的行为是一个坏主意;存在使用可选参数获取选项的程序,它们与您描述的内容完全不同。您的方法可能会使您的用户感到困惑;它将使其他程序难以与之互操作;它将限制脚本未来的可扩展性。 (想象一下,您希望稍后添加其他选项。your_script.sh -d -e
会将-e
作为参数传递给-d
,即使用户想要使用-d
而没有任何参数和意图-e
作为一个单独的选项。)如果一个参数在命令行上,但是两个参数来自标准输入,那么特别奇怪。
那就是说。 。
要实现可选option-argument的某些效果,可以通过放置冒号getopts
来告诉:
“静默”(即使用“无提示错误报告”)在选项字符串的开头。 (例如,代替getopts d: ...
,您将编写getopts :d: ...
。)然后,当缺少选项的参数时,它会将选项名称设置为:
(而不是{{1} }}和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