带有单选选项的Shell脚本

时间:2017-02-11 11:09:56

标签: bash shell options getopt getopts

我想知道,是否可以使用getoptgetopts编写一个包含不允许组合多个选项的选项的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 alphaoption -b将运行long version betaoption -c它将运行short version alphaoption -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

2 个答案:

答案 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