为什么 bash 中的 getopts 不产生:(每个文档)当选项缺少其相关参数时?



我对这个领域相对较新,我正在使用以下代码片段运行名为"statsrandomrun.sh"的 shell 脚本:

#!/bin/bash
while getopts "m:s:xh" opt; do
case $opt in
m)
MU=$OPTARG; mflag=true; ;;
s)
SIGMA=$OPTARG; sflag=true; ;;
h)
usage; exit;;
x)
xflag=true ;;
?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "HaHa! Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done

但似乎每当我传递这个命令时

/.statsrandomrun.sh -m 

我从来没见过

echo "HaHa! Option -$OPTARG requires an argument." >&2

工作,我在上面的代码片段中实现了。我的 bash 只是向我展示了一些其他信息:

option requires an argument -- m

我没有明显地放入我的代码中。还有另一条线

Invalid option: -

我希望这会发生,因为help getopts的输出包含以下内容:

如果未找到必需的参数,getopts 会将":"放入 NAME 中,并将 OPTARG 设置为找到的选项字符。

发生了什么事情?有什么想法吗? 我将不胜感激任何帮助提前:)

根据文档,这是help getopts

getopts: getopts optstring name [arg]

OPTSTRING 包含要识别的选项字母;如果是字母 后跟一个冒号,该选项应具有参数, 应该用空格与它隔开。

getopts 以以下两种方式之一报告错误。 如果第一个字符 的 OPTSTRING 是一个冒号,getopts 使用静默错误报告。 在 此模式,不会打印任何错误消息。................ 如果 找不到必需的参数,getopts 在 NAME 中放置一个 ':",并且 将 OPTARG 设置为找到的选项字符。 如果 getopts 不在 静音模式,...如果未找到必需的参数,则使用"?"。 放在 NAME 中,OPTARG 未设置,诊断消息为 印刷。

当我在非静音模式下实现我的getopts函数时,/.statsrandomrun.sh -m后这个缺失的参数触发了?存储在$Name中(在我的情况下$opt(,$OPTARG中没有内容。

所以执行了这些代码行:

?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;

它与内置诊断味精一起产生Invalid option: -

相反,为了得到我想要的结果,我应该使用静音模式,如

#!/bin/bash
while getopts ":m:s:xh" opt; do
#codes
done

通过在 OPTSTRING 中添加前面的冒号。

最新更新