我创建了一个 bash 脚本,我想在其中添加帮助选项,例如、-h
和其他一些选项。--help
--verbose
如果我像描述的那样创建它这里这会成为标准解决方案吗?
# Execute getopt on the arguments passed to this program, identified by the special character $@
PARSED_OPTIONS=$(getopt -n "$0" -o h123: --long "help,one,two,three:" -- "$@")
#Bad arguments, something has gone wrong with the getopt command.
if [ $? -ne 0 ];
then
exit 1
fi
# A little magic, necessary when using getopt.
eval set -- "$PARSED_OPTIONS"
# Now goes through all the options with a case and using shift to analyse 1 argument at a time.
#$1 identifies the first argument, and when we use shift we discard the first argument, so $2 becomes $1 and goes again through the case.
while true;
do
case "$1" in
-h|--help)
echo "usage $0 -h -1 -2 -3 or $0 --help --one --two --three"
shift;;
-1|--one)
echo "One"
shift;;
-2|--two)
echo "Dos"
shift;;
-3|--three)
echo "Tre"
# We need to take the option of the argument "three"
if [ -n "$2" ];
then
echo "Argument: $2"
fi
shift 2;;
--)
shift
break;;
esac
done
或者是否有另一种定义的方式来实现这一点?
答案1
case
实际上,shell 脚本编写者以与您非常相似的方式使用语句编写自己的参数解析是很常见的。现在,它是否是最好或最标准的解决方案,还有待争论。就我个人而言,由于我使用 C 的经验,我更喜欢使用名为 的实用程序getopt
。
从getopt.1
手册页:
getopt 用于分解(解析)命令行中的选项,以便 shell 过程轻松解析,并检查合法选项。它使用 GNU getopt(3) 例程来执行此操作。
鉴于您已经打电话getopt
,我想说您的方向完全正确。如果您愿意,您可以简单地使用语句迭代命令行参数case
来处理这些情况;但是,正如您可能已经发现的那样,它getopt
实际上为您完成了所有这些繁重的工作。
TL;DR:这是一个 shell 脚本,你可以按照你想要的方式实现它;但getopt
对此很有用。