如果未提供任何选项,则让 getopts 显示帮助
Posted
技术标签:
【中文标题】如果未提供任何选项,则让 getopts 显示帮助【英文标题】:Having getopts to show help if no options provided 【发布时间】:2014-12-22 21:45:15 【问题描述】:我解析了这里发布的一些类似问题,但它们不适合我。
我有一个很棒的 bash 脚本,它有一些很酷的功能,下面是代码的相关部分:
while getopts ":hhelpf:d:c:" ARGS;
do
case $ARGS in
h|help )
help_message >&2
exit 1
;;
f )
F_FLAG=1
LISTEXPORT=$OPTARG
;;
d )
D_FLAG=1
OUTPUT=$OPTARG
;;
c )
CLUSTER=$OPTARG
;;
\? )
echo ""
echo "Unimplemented option: -$OPTARG" >&2
echo ""
exit 1
;;
: )
echo ""
echo "Option -$OPTARG needs an argument." >&2
echo ""
exit 1
;;
* )
help_message >&2
exit 1
;;
esac
done
现在,如果触发,我的所有选项都可以正常工作。我想要的是 getopts 在没有触发任何选项时吐出 help_message 函数,比如说脚本只是在 ./scriptname.sh 没有参数的情况下启动的。
我看到这里发布了一些方法,实现了 IF 循环和 函数 但是,由于我刚开始使用 bash 并且我已经在此脚本上有了一些 IF 循环,我想知道是否有更简单(且漂亮)的方法。
【问题讨论】:
我不认为help
中的 getopts
字符串正在做你期望它做的事情。 getopts
不做长选项。这应该是为该调用添加e
、l
和p
的选项。
help
工作正常。
您确定对此有信心吗?你在测试什么才能看到?在h|help
case 块中粘贴echo case h
,在*
case 中粘贴echo 'case *'
,然后尝试script --help
(然后script -l
),看看你会得到什么。还有script --help
(这将是长选项版本)。
我看到你在说什么,但我只是做了它并且它有效。我可以通过 -h 或 -help 调用脚本,它可以工作。
这些都不是我告诉你要测试的。做我实际上告诉你的事情来测试,看看你从那些添加的echo
行中得到什么输出。你不会得到你期望的案例。
【参考方案1】:
如果您只想检测不带任何选项调用的脚本,那么只需检查脚本中$#
的值,并在其为零时退出并显示消息。
如果你想捕捉没有传递选项参数(但非选项参数)仍然传递的情况,那么你应该能够在 getopts
循环之后检查 OPTIND
的值并在它是时退出1(表示第一个参数是非选项参数)。
【讨论】:
【参考方案2】:非常感谢 Etan Reisner,我最终采纳了您的建议:
if [ $# -eq 0 ];
then
help_message
exit 0
else
...... remainder of script
这完全符合我的设想。 谢谢。
【讨论】:
【参考方案3】:从@Etan Reisner 的声明中删除示例代码:
如果你想捕捉没有传递选项参数(但非选项参数)仍然传递的情况,那么你应该能够在 getopts 循环之后检查 OPTIND 的值并在它为 1 时退出(表明第一个参数是非选项参数)。
# Check if any arguments were passed
if [ $OPTIND -eq 1 ]; then
help_message
exit 1
fi
# ........ the rest of the script
以防万一有人想要一个示例视觉 ?
【讨论】:
以上是关于如果未提供任何选项,则让 getopts 显示帮助的主要内容,如果未能解决你的问题,请参考以下文章