使用 case 语句将标志传递给 bash 脚本 - 仅设置第一个标志

使用 case 语句将标志传递给 bash 脚本 - 仅设置第一个标志

这可能是一个明显的错误,但我只是没有看到它。我有一个 case 语句,应该能够将参数传递给脚本(例如script.sh --verbose --all:)。

由于某种原因,这个特定的函数无法正常工作 - 它只适用于我首先传递的标志:

#Pass arguments to the script
flags()
{
    while test $# -gt 0
    do
        case "$1" in
        (-v|--verbose)
            shift
            export VERBOSE="1"
            shift;;
        (-vv|--extra-verbose)
            shift
            export VERBOSE="1"
            export EXTRA_VERBOSE="1"
            shift;;
        (-a|--all)
            shift
            export ALL="1"
            shift;;
        (-h|--help)
            usage;;
        (*) usage;;
        esac
    done
}
flags "$@"
echo "Verbose: $VERBOSE, Extra Verbose: $EXTRA_VERBOSE, All: $ALL"

所以在这种情况下,如果我通过-v -a,脚本只会设置$VERBOSE变量。如果我通过-a -v,脚本将只设置$ALL变量。

我有很多使用这种结构的脚本,但它们没有表现出这一点。

如果您能帮我弄清楚我错过了什么,我将非常感激。

谢谢!

答案1

你有太多了shift。它应该只执行一次,在处理完一个参数后,你可以转向下一个。

#!/bin/sh
#Pass arguments to the script
flags()
{
    while test $# -gt 0
    do
        case "$1" in
        -v|--verbose)
            export VERBOSE="1"
            ;;
        -vv|--extra-verbose)
            export VERBOSE="1"
            export EXTRA_VERBOSE="1"
            ;;
        -a|--all)
            export ALL="1"
            ;;
        -h|--help)
            usage;;
        *) usage;;
        esac

        # and here we shift to the next argument 
        shift
    done
}
flags "$@"
echo "Verbose: $VERBOSE, Extra Verbose: $EXTRA_VERBOSE, All: $ALL"

相关内容