0

現在、サーバー起動スクリプトに取り組んでいます。すべて問題ないように見えますが、実行されないため、-n フラグを使用して構文を確認しました。私は私にエラーを与えました:

Syntax error: word unexpected (expecting "in")

in が適切な場所にあるため、これは本当に奇妙です!

これは行です:

            case $vtyp in

そして、これはコード全体です:

#!/bin/bash
BACKUP_PATH="$HOME/backups"
MINECRAFT_PATH="$HOME/server"
SCREEN_NAME="brain"
SERVER_JAR="minecraft.jar"
SERVER_JAR_PATH="$MINECRAFT_PATH/$SERVER_JAR"
RAM="Xmx1G";
MESSAGE_BACKUP="Backup wird erstellt..."
MESSAGE_STARTING="Server wird gestartet..."
MESSAGE_ALREADY_STARTED="Server bereits gestartet, wechsle zur Konsole..."
MESSAGE_NOT_STARTED="Fehler, nicht gestartet..."
MESSAGE_UNKNOWN="Unbekanntes Argument $1"
MESSAGE_INVALID_VERSION="Unbekannter Versionstyp."
MESSAGE_VERSIONS="Bitte Version auswählen:
1 = Stable - Stabile Version
2 = Beta - Betaversion
3 = Dev - Entwicklungsversion
"
MESSAGE_VERSION_TYPES="Versionstypen: >>stable<< - Stabile Version >>beta<< - Betaversion >>dev<< - Entwicklungsversion"

URL_JAR_STABLE=""
URL_JAR_BETA=""
URL_JAR_DEV=""

DO_BACKUP()
{
    cd $HOME
    echo $MESSAGE_BACKUP
    mkdir $BACKUP_PATH
    date=$(date '+%Y-%m-%d %H-%M-%S')

    tar -cjvf "$BACKUP_PATH/Complete Backup $date.tar.bz2" $MINECRAFT_PATH

    rm -rf "$MINECRAFT_PATH/server.log backups/*"
}

DO_START()
{
    cd $MINECRAFT_PATH
    echo $MESSAGE_STARTING
    screen  -A -m -d -S $SCREEN_NAME java -$RAM -jar $SERVER_JAR_PATH -o true
}

DO_REATTACH()
{
    echo $MESSAGE_ALREADY_STARTED
    screen -d -r $SCREEN_NAME
}

DO_KILL()
{
    if [ screen -list | grep -q $SCREEN_NAME ]
    then
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say Server wird gestoppt.\r"`"
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 30\r"`"
        sleep 10
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 20\r"`"
        sleep 5
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 15\r"`"
        sleep 5
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 10\r"`"
        sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 9\r"`"
        sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 8\r"`"
        sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 7\r"`"
        sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 6\r"`"
        sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 5\r"`"
        sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 4\r"`"
        sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 3\r"`"
        sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 2\r"`"
        sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 1\r"`"
        sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"

        screen -d -r $SCREEN_NAME
    else
        echo $MESSAGE_NOT_STARTED
    fi
}

DO_NORMAL()
{
    if [ ! screen -list | grep -q $SCREEN_NAME ]
    then
        if [ ! -f $SERVER_JAR_PATH ]
        then
            DO_UPDATE
            DO_NORMAL
        else
            DO_BACKUP
            DO_START
        fi
    else
        DO_REATTACH
    fi
}

DO_UPDATE()
{
    if [ $# -lt 1 ]
    then
        while [ true ]
        do
            read -p "$MESSAGE_VERSIONS" vtyp

            case $vtyp in
                [1]*) DO_UPDATE "stable"; break;;
                [2]*) DO_UPDATE "beta"; break;;
                [3]*) DO_UPDATE "dev"; break;;
                * ) echo $MESSAGE_INVALID_VERSION;;
            esac
        done
    else
        if [ $1 = "stable" ]
        then
            mkdir $MINECRAFT_PATH
            wget $URL_JAR_STABLE -O "$SERVER_JAR_PATH"
        elif [ $1 = "beta" ]
        then
            mkdir $MINECRAFT_PATH
            wget $URL_JAR_BETA -O "$SERVER_JAR_PATH"
        elif [ $1 = "dev" ]
        then
            mkdir $MINECRAFT_PATH
            wget $URL_JAR_DEV -O "$SERVER_JAR_PATH"
        else

        echo $MESSAGE_INVALID_VERSION
        echo $MESSAGE_VERSION_TYPES
        fi
    fi
}

if [ $# -lt 1 ]
then
    DO_NORMAL
else
    if [ $1 = "backup" ]
    then
        if screen -list | grep -q $SCREEN_NAME;
        then
            DO_KILL
            DO_BACKUP
            DO_START
        else
            DO_BACKUP
        fi
    elif [ $1 = "kill" ]
    then
        DO_KILL
    elif [ $1 = "update" ]
    then
        DO_KILL
        DO_UPDATE $2
    else
        echo $MESSAGE_UNKNOWN
    fi
fi

誰かがなぜこれが起こっているのか考えていますか? 私はシェルにかなり慣れていないので、ほとんどのコードをコピーして貼り付けましたが、これに関する限り、私はそれを理解しています! そして、これは本当に私の心を押しつぶします。なぜこれが起こっているのか分かりません。

PS: で同じタイプのエラーが発生しelifます。なにが先でも!

4

3 に答える 3

2

答えではありませんが、コード レビュー: DO_UPDATE 関数を書き直します。

初め

MESSAGE_VERSION_PROMPT="Bitte Version auswählen: "
MESSAGE_VERSIONS=(
    "Stable - Stabile Version"
    "Beta - Betaversion"
    "Dev - Entwicklungsversion"
)

それで

DO_UPDATE()
{
    if (( $# == 0 )); then
        local PS3="$MESSAGE_VERSION_PROMPT"
        select choice in "${MESSAGE_VERSIONS[@]}"; do
            case $REPLY in
                1) set -- stable; break ;;
                2) set -- beta  ; break ;;
                3) set -- dev   ; break ;;
            esac
        done
    fi
    case $1 in
        stable)
            mkdir $MINECRAFT_PATH
            wget $URL_JAR_STABLE -O "$SERVER_JAR_PATH"
            ;;
        beta)
            mkdir $MINECRAFT_PATH
            wget $URL_JAR_BETA -O "$SERVER_JAR_PATH"
            ;;
        dev)
            mkdir $MINECRAFT_PATH
            wget $URL_JAR_DEV -O "$SERVER_JAR_PATH"
            ;;
        *) 
            echo $MESSAGE_INVALID_VERSION
            echo $MESSAGE_VERSION_TYPES
            return 1
            ;;
    esac
}
于 2013-08-06T15:43:53.850 に答える