bash中的多重复合比较

时间:2011-11-16 12:52:44

标签: bash

我有一个获取选项的bash脚本(使用getopts)。假设它们是'-n',' - d',' - u'。我只想选择一个选项,如果没有,它会提示用户错误。

代码是这样的:

    while getopts ":dun" name; do

            case $name in

              d  )
                    DELETE='YES'
                    ;;
              u  )
                    UPDATE='YES'
                    ;;
              n  )
                    NEW='YES'
                    ;;
            esac
     done

我一次只能 $ DELETE $ UPDATE $ NEW 成为'YES',这意味着用户无法具体' -n'和'-d'在同一时间或'-u'和'-n'同时,如何在IF语句中实现?

我一直在stackoverflow中寻找这个,但找不到任何。谢谢你的帮助,伙计!

4 个答案:

答案 0 :(得分:2)

每次getopts()检测到一个有效的命令行选项时,您都可以递增计数器。然后,在循环测试计数器的值之后。如果它大于1,则指定了多个选项。

答案 1 :(得分:1)

这是一个完整的黑客攻击,取决于选项变量是未设置还是“是”(在我写的形式中,仅限bash):

if [[ "$DELETE$UPDATE$NEW" == YESYES* ]]; then
    echo "Please only use one of -d, -u, and -n" >&2
    exit 1
fi

(如果你使用的是品牌-x shell而不是bash,那就像if [ "$DELETE$UPDATE$NEW" = "YESYES" -o "$DELETE$UPDATE$NEW" = "YESYESYES" ]; then

答案 2 :(得分:0)

最好将变量设置为truefalse,这样您就可以编写

if $DELETE; then
  echo "You've already specified UPDATE!"
fi

和类似的。

然而,调用选项是因为它们应该是可选,并且通常是正交的。 (在一些情况下,常见实用程序的选项相互排斥,但绝大多数都没有)。你想要的实际上是一种强制操作模式,所以你不应该把它作为一个选项接收,而只是作为第一个命令行参数。

答案 3 :(得分:0)

您可以使用一些getopt-kludge来管理只选择其中一个选项。

#!/bin/bash

while [ $# -gt 0 ]; do
    case "$1" in
        -u)
            echo "got -u"
            break
            ;;
        -d)
            echo "got -d"
            break
            ;;
        -n)
            echo "got -n"
            break
            ;;
        *)
            echo "some error"
            break
            ;;
    esac
done