我想知道,是否可以使用getopt
或getopts
编写一个包含不允许组合多个选项的选项的shell脚本?
例如,我的脚本可以以两种可能的模式运行 - 长或短,带有alpha或beta选项,这就是我想使用./script.sh -l -a
,./script.sh -l -b
或./script.sh -s -a
的原因, ./script.sh -s -b
,但不应同时同时运行选项-l
和-s
或-a
和-b
。
我知道它可以变得更容易,因为我可以option -a
运行long version alpha
,option -b
将运行long version beta
,option -c
它将运行short version alpha
,option -d
将运行short version beta
,但我想使用两个选项,只需了解这种方式是否可行。
请使用“选项”查找以下代码,以便使用简单的read
进行选择,我想将其转换为getopt(s)
#!/bin/bash
echo "Please insert the text:"
read text
echo
echo "You entered $text"
echo "Choose version:
1) Long
2) Short
3) Quit
-> "
read option
# OPTION 1
if [ "$option" == "1" ]; then
echo "Choose method:
1) alpha
2) beta"
read method
# METHOD 1
if [ "$method" == "1" ]; then
longalpha
fi
# METHOD 2
if [ "$method" == "2" ]; then
longbeta
fi
fi
#OPTION 2
if [ "$option" == "2" ]; then
echo "Choose method:
1) alpha
2) beta"
read method2
# METHOD 1
if [ "$method2" == "1" ]; then
shortalpha
fi
# METHOD 2
if [ "$method2" == "2" ]; then
shortbeta
fi
fi
if [ "$option" == "3" ]; then
echo "Good Bye!"
fi
答案 0 :(得分:1)
您应首先解析所有选项,并设置指示已通过哪些选项以及哪些未通过的变量。
然后,在实际执行任何操作之前,请测试-l
和-s
是否存在或两者都丢失,如果是,请退出并显示相应的错误消息。
您可以使用-a
和-b
一旦你知道你拥有所需的一切,但仅此而已,你可以让你的脚本执行适当的操作。
答案 1 :(得分:0)
运行getopts
时,您可以通过 un 设置表示该标志的变量来检查是否已设置了独占标志。
我们假设您有两个变量可以决定您想要做什么,并且他们开始未设置:
unset vers meth
你还有一个行动标志的查找表,如:
declare -A flags=([l]=long [s]=short [a]=alpha [b]=beta)
然后你可以像getopts
那样运行:
while getopts "lsab" opt; do
case $opt in
(l|s) [[ $vers ]] && fail # we already set $vers
vers=${flags[$opt]} ;;
(a|b) [[ $meth ]] && fail # we already set $meth
meth=${flags[$opt]} ;;
('?') fail ;; # we got some unknown option
esac
done
唯一剩下的就是检查我们是否为$vers
和$meth
获取某些:
[[ $vers && meth ]] || fail
然后执行你的任务:
$vers$method
你处理这最后一部分的方式取决于你的代码的细节,但由于你正在调用shortalpha
等,这种方式非常适合。如果您正在调用某些外部代码,则可能类似于prog --$vers --$meth
等