bash 스크립트에 플래그를 전달하려면 Case 문을 사용하세요. 첫 번째 플래그만 설정하세요.

bash 스크립트에 플래그를 전달하려면 Case 문을 사용하세요. 첫 번째 플래그만 설정하세요.

이것은 아마도 명백한 버그일 것입니다. 그러나 나는 그것을 보지 못합니다. 스크립트에 인수를 전달할 수 있어야 하는 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"

관련 정보