3

このbashスクリプトで私が間違っていることを誰かが見つけてくれますか. case ステートメント内で if ステートメントを使用しようとしていますが、bash が構文エラーを訴えています。

findinfo() {
OPT1=$1
case  "$OPT1" in
   linux)
        echo "Setting environment"
        ESC="hello_linux" if [[ "$PROJN" == "ONE" ||  "$PROJN" == "two" ]]
        ;;
   Windows)
        echo "Setting environment"
        ESC="hello_windows" if [[ "$PROJN" == "ONE" ||  "$PROJN" == "two" ]]
        ;;
   Android)
        echo "Setting environment"
        ESC="hello_android" if [[ "$PROJN" == "ONE" ||  "$PROJN" == "two" ]]
        ;;
esac

}

ありがとう

4

3 に答える 3

6

次の構文は、より簡潔な代替手段です。

[[ $PROJN = ONE || $PROJN = TWO ]] && ESC=hello_linux

...そして、以下はさらに短く、古いシェルに準拠しています:

case $PROJN in ONE|TWO) ESC=hello_linux ;; esac
于 2013-07-30T14:42:37.610 に答える
1

ifcase ステートメントの中で使用しても問題はありません。それはあなたのif発言が少し間違っているということです。

if課題と同じ行にステートメントがありました$ESC。外側では機能caseしません。内側では機能しません。また、ステートメントで for を使用する必要がありステートメント-oがtrue の場合、実行するには少なくとも 1 行が必要です。(プレースホルダーとして を入れただけです)。ififecho

この特定ifのステートメントは、case. それらはすべて同じであることに気付きます。ifその場合、コードを複製する必要はありませんesac

ところで、or次の 2 つの方法のいずれかで、if の内部を実行できます。

if [[ "$PROJN" == "ONE" -o  "$PROJN" == "two" ]]

また

if [[ "$PROJN" == "ONE" ]] || [[  "$PROJN" == "two" ]]

そして今、定期的に予定されているプログラムに戻ります...

findinfo() {
    OPT1=$1
    case  "$OPT1" in
       linux)
            echo "Setting environment"
            ESC="hello_linux" 
            if [[ "$PROJN" == "ONE" -o  "$PROJN" == "two" ]]
            then
                 echo "Here be dragons..."
            fi
            ;;
       Windows)
            echo "Setting environment"
            ESC="hello_windows" 
            if [[ "$PROJN" == "ONE" -o  "$PROJN" == "two" ]]
            then
                 echo "Here be dragons..."
            fi
            ;;
       Android)
            echo "Setting environment"
            ESC="hello_android" 
            if [[ "$PROJN" == "ONE" -o "$PROJN" == "two" ]]
            then
                 echo "Here be dragons..."
            fi
            ;;
    esac
}
于 2013-07-30T14:42:30.273 に答える