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。一度だけ実行する必要があり、1つのパラメータを処理してから次のパラメータに進むことができます。

#!/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"

おすすめ記事