在交换机bash中只允许一个字母

时间:2018-04-08 23:20:43

标签: bash macos switch-statement

我希望我的bash脚本只接受交换机中的一个字母,后面没有任何字母。

这是我的代码(foo.sh):

#!/bin/bash
while getopts ":ap" jeep;do
    case $jeep in
    a)
    echo 'Hi Brad'
    ;;
    b)
    echo 'Hi Eddy'
    ;;
    else)
    echo 'Hi whoever'
    \?)
    echo 'Bad input' >&2
    exit 1
    ;;
    esac
done

我希望它像这样:

$ foo.sh -a
Hi Brad

$ foo.sh -b
Hi Eddy

$ foo.sh
Hi whoever

$ foo.sh -r
Bad input

$ foo.sh -ab
Bad input

$ foo.sh -ba
Bad input

相反,如果我使用a,它会同时运行b-ab(如下所示),我不想要它。

$ foo.sh -ab
Hi Brad
Hi Eddy

此外,else)并不像我喜欢的那样工作。如果输入没有开关,我希望它说Hi whoever

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

getopt无法指定互斥标志,因此您必须创建自己的标志。最简单的方法可能是这样的:

while getopts ":ab" jeep
do
    case $jeep in
        a)
            if [ -n "${run-}" ]
            then
                exit 1
            fi
            echo 'Hi Brad'
            run=1
            ;;
        b)
            if [ -n "${run-}" ]
            then
                exit 1
            fi
            echo 'Hi Eddy'
            run=1
            ;;
        \?)
            if [ -n "${run-}" ]
            then
                exit 1
            fi
            echo 'Hi whoever'
            run=1
            ;;
    esac
done