неожиданный EOF и конец документа

Я играл с этим кодом в течение нескольких дней. Обратите внимание, я - новичок. Я просто хочу заставить свой сценарий мочь загрузить удаленный файл и просканировать плагины Minecraft. Я заставил плагины сканирования работать, но у меня есть две других проблемы. Один, я не могу заставить mc_addplugin работать правильно, и я получаю Неожиданный EOF и неожиданный конец документа при выполнении любой другой команды помимо mc_scanplugins или mc_start

bash: -c: line 0: unexpected EOF while looking for matching `"'
bash: -c: line 1: syntax error: unexpected end of file

Справка так ценилась бы!Заранее спасибо.

#!/bin/bash
# /etc/init.d/craftbukkit
# version 0.9.1 2012-07-06 (YYYY-MM-DD)

### BEGIN INIT INFO
# Provides:               craftbukkit
# Required-Start:         $local_fs $remote_fs
# Required-Stop:          $local_fs $remote_fs
# Should-Start:           $network
# Should-Stop:            $network
# Default-Start:          2 3 4 5
# Default-Stop:           0 1 6
# Short-Description:      Starts craftbukkit server
# Description:            Starts and controls the craftbukkit server
### END INIT INFO

# SETTINGS
SERVICE='craftbukkit-1.2.5-R1.0.jar'
OPTIONS='nogui'
USERNAME='smith'

# LIST ALL THE WORLDS IN YOUR CRAFTBUKKIT SERVER FOLDER
WORLDS[1]='world'
WORLDS[2]='world_nether'
WORLDS[3]='world_the_end'
WORLDS[4]='flat_world'

MCPATH='/var/www/servers/Foundation'
PLUGINSPATH='/var/www/servers/Foundation/plugins'
TEMPPLUGINS='/var/www/servers/Foundationplugins/temp_plugins'
BACKUPPATH='/var/www/servers/Foundation/backup'

CPU_COUNT=2
INVOCATION="java -Xmx2024M -Xms2024M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts -jar $SERVICE $OPTIONS"

ME=`whoami`
as_user() {
  if [ $ME == $USERNAME ] ; then
    bash -c "$1"
  else
    su - $USERNAME -c "$1"
  fi
}

mc_start() {
  if  pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is already running!"
  else
    echo "Starting $SERVICE..."
    cd $MCPATH
    as_user "cd $MCPATH && screen -dmS craftbukkit $INVOCATION"
    sleep 7
    if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "$SERVICE is now running."
    else
      echo "Error! Could not start $SERVICE!"
    fi
  fi
}

mc_saveoff() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running... suspending saves"
    as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"say The server is preforming a backup. Server going to read-only mode. Do not build...\"\015'"
    as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"save-off\"\015'"
    as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"save-all\"\015'"
    sync
    sleep 10
  else
    echo "$SERVICE is not running. Not suspending saves."
  fi
}

mc_save() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running... Saving worlds..."
    as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"save-all\"\015'"
    sync
    sleep 10
    echo "Save complete!"
  else
    echo "$SERVICE is not running. Cannot save!"
  fi
}

mc_saveon() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running... re-enabling saves"
    as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"save-on\"\015'"
    as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"say Server backup has completed. Server going to read-write mode. You can now continue building...\"\015'"
  else
    echo "$SERVICE is not running. Not resuming saves."
  fi
}

mc_stop() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "Stopping $SERVICE"
    as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"say $SERVERNAME is shutting down in 30 seconds! Please stop what you are doing. Check back later, we'll be back!\"\015'"
    as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"save-all\"\015'"
    sleep 30
    as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"stop\"\015'"
    sleep 7
  else
    echo "$SERVICE was not running."
  fi
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "Error! $SERVICE could not be stopped."
  else
    echo "$SERVICE is stopped."
  fi
}

mc_update() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running! Will not start update."
  else
    MC_SERVER_URL=http://dl.bukkit.org/latest-rb/craftbukkit.jar
    as_user "cd $MCPATH && wget -q -O $MCPATH/craftbukkit_server.jar.update $MC_SERVER_URL"
    if [ -f $MCPATH/craftbukkit_server.jar.update ]
    then
      if `diff $MCPATH/$SERVICE $MCPATH/craftbukkit_server.jar.update >/dev/null`
      then 
        echo "You are already running the latest version of $SERVICE. Update anyway? [Y/n]"
            select yn in "Yes" "No"; do
                case $yn in
                    Yes )   as_user "mv $MCPATH/$SERVICE $MCPATH/${SERVICE}_old.jar"
                            as_user "mv $MCPATH/craftbukkit_server.jar.update $MCPATH/$SERVICE"
                            echo "$SERVICE updated successfully!"; break;;
                    No )    echo "The update was not installed! Removing temporary files and exiting..."
                            as_user "rm $MCPATH/craftbukkit_server.jar.update" exit;;
                    esac
            done
      else
        as_user "mv $MCPATH/$SERVICE $MCPATH/${SERVICE}_old.jar"
        as_user "mv $MCPATH/craftbukkit_server.jar.update $MCPATH/$SERVICE"
        echo "$SERVICE updated successfully!"
      fi
    else
      echo "$SERVICE update could not be downloaded."
    fi
  fi
}

    mc_addplugin() {
        if pgrep -u $USERNAME -f $SERVICE > /dev/null
        then
            echo "$SERVICE is running! Please stop the service before adding a plugin."
        else
            echo "Paste the URL to the .JAR Plugin..."
            read JARURL
            JARNAME=$(basename "$JARURL")
            if [ -d "$TEMPPLUGINS" ]
            then
                as_user "cd $PLUGINSPATH && wget -r -A.jar $JARURL -o temp_plugins/$JARNAME"
            else
                as_user "cd $PLUGINSPATH && mkdir $TEMPPLUGINS && wget -r -A.jar $JARURL -o temp_plugins/$JARNAME"
            fi
            if [ -f "$TMPDIR/$JARNAME" ]
            then
                if [ -f "$PLUGINSPATH/$JARNAME" ]
                then
                    if `diff $PLUGINSPATH/$JARNAME $TMPDIR/$JARNAME >/dev/null`
                    then 
                        echo "You are already running the latest version of $JARNAME."
                    else
                        NOW=`date "+%Y-%m-%d_%Hh%M"`
                        echo "Are you sure you want to overwrite this plugin? [Y/n]"
                        echo "Note: Your old plugin will be moved to the "$TEMPPLUGINS" folder with todays date."
                        select yn in "Yes" "No"; do
                            case $yn in
                                Yes ) as_user "mv $PLUGINSPATH/$JARNAME $TEMPPLUGINS/${JARNAME}_${NOW} && mv $TEMPPLUGINS/$JARNAME $PLUGINSPATH/$JARNAME"; break;;
                                No ) echo "The plugin has not been installed! Removing temporary plugin and exiting..."
                                    as_user "rm $TEMPPLUGINS/$JARNAME"; exit;;
                            esac
                        done
                        echo "Would you like to start the $SERVICE now? [Y/n]"
                        select yn in "Yes" "No"; do
                            case $yn in
                                Yes ) mc_start; break;;
                                No ) "$SERVICE not running! To start the service run: /etc/init.d/craftbukkit start"; exit;;
                                esac
                        done
                    fi
                else
                    echo "Are you sure you want to add this new plugin? [Y/n]"
                    select yn in "Yes" "No"; do
                        case $yn in
                            Yes ) as_user "mv $PLUGINSPATH/$JARNAME $TEMPPLUGINS/${JARNAME}_${NOW} && mv $TEMPPLUGINS/$JARNAME $PLUGINSPATH/$JARNAME"; break;;
                            No ) echo "The plugin has not been installed! Removing temporary plugin and exiting..."
                                as_user "rm $TEMPPLUGINS/$JARNAME"; exit;;
                        esac
                    done
                    echo "Would you like to start the $SERVICE now? [Y/n]?"
                    select yn in "Yes" "No"; do
                        case $yn in
                            Yes ) mc_start; break;;
                            No ) "$SERVICE not running! To start the service run: /etc/init.d/craftbukkit start"; exit;;
                        esac
                    done
                fi
            else
                echo "Failed to download the plugin from the URL you specified!"
                exit;
            fi
        fi
    }

mc_scanplugins() {
    if [ "$(ls -A $PLUGINSPATH)" ]
    then

        shopt -s nullglob
        PLUGINS=($PLUGINSPATH/*.jar)
        i=1
        for f in "${PLUGINS[@]}"
        do
            echo "${i}: $f"
            PLUGIN[$i]=$f
            i=$(( $i + 1 ))
        done

        echo "Enter the ID of a plugin you want removed, or any other key to cancel."

        read INPUT

        if [ ! -z "${INPUT##*[!0-9]*}" ]
        then
            if [ -f "${PLUGIN[INPUT]}" ]
            then
                echo "Removing plugin..."
                JAR=$(basename ${PLUGIN[INPUT]})
                JARNAME=${JAR%.jar}
                as_user "rm -f ${PLUGIN[INPUT]}"
                sleep 2
                as_user "cd $PLUGINSPATH && rm -rf ./${JARNAME}"
                if [ -f "${PLUGINSPATH}/${JARNAME}" ]
                then
                    echo "Plugin folder could not be removed..."
                fi
                echo "Plugin removed."
            else
                echo "${PLUGIN[INPUT]}"
                echo "Invalid plugin! Does not exist! Canceling..."
                exit;
            fi
        else
            echo "Canceling..."
            exit;
        fi
    else
        echo "You have no plugins installed."
        exit;
    fi
}

mc_backup() {
   mc_saveoff

   for i in "${WORLDS[@]}"; do 
   NOW=`date "+%Y-%m-%d_%Hh%M"`
   BACKUP_FILE="$BACKUPPATH/${i}_${NOW}.tar"
   echo "Backing up world: $i..."
   #as_user "cd $MCPATH && cp -r $i $BACKUPPATH/${i}_`date "+%Y.%m.%d_%H.%M""`
   as_user "tar -C \"$MCPATH\" -cf \"$BACKUP_FILE\" $i"
   done

   echo "Backing up $SERVICE"
   as_user "tar -C \"$MCPATH\" -rf \"$BACKUP_FILE\" $SERVICE"
   #as_user "cp \"$MCPATH/$SERVICE\" \"$BACKUPPATH/craftbukkit_server_${NOW}.jar\""

   mc_saveon

   echo "Compressing backup..."
   as_user "tar -cvzf $BACKUPPATH/server_backup_${NOW}.tar.gz $MCPATH"
   echo "Backup has completed successfully."
}

mc_command() {
  command="$1";
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    pre_log_len=`wc -l "$MCPATH/server.log" | awk '{print $1}'`
    echo "$SERVICE is running... executing command"
    as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"$command\"\015'"
    sleep .1 # assumes that the command will run and print to the log file in less than .1 seconds
    # print output
    tail -n $[`wc -l "$MCPATH/server.log" | awk '{print $1}'`-$pre_log_len] "$MCPATH/server.log"
  fi
}

#Start-Stop here
case "$1" in
  start)
    mc_start
    ;;
  stop)
    mc_stop
    ;;
  restart)
    mc_stop
    mc_start
    ;;
  save)
    mc_save
    ;;
  update)
    mc_stop
    mc_backup
    mc_update
    mc_start
    ;;
  scanplugins)
    mc_scanplugins
    ;;
  addplugin)
    mc_addplugin
    ;;
  backup)
    mc_backup
    ;;
  status)
    if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "$SERVICE is running."
    else
      echo "$SERVICE is not running."
    fi
    ;;
  command)
    if [ $# -gt 1 ]; then
      shift
      mc_command "$*"
    else
      echo "Must specify server command (try 'help'?)"
    fi
    ;;

  *)
  echo "Usage: $0 {start|stop|update|backup|status|restart|command \"server command\"}"
  exit 1
  ;;
esac

exit 0
0
задан 10 July 2012 в 07:18

2 ответа

Учите человека, как ловить рыбу:

Прочитайте сообщение об ошибке тщательно и попытайтесь изобразить, куда оно прибывает из

В этом случае мы имеем:

bash: -c: line 0: unexpected EOF while looking for matching `"'
bash: -c: line 1: syntax error: unexpected end of file

Q: Посмотрите на сценарий. Где у нас есть вызов, чтобы 'колотить' с-c (команда) опцию?

A: в as_user () функция, у нас есть вызов:

bash -c "$1"

Теперь, 1$ здесь является первым аргументом, переданным as_user () функция, таким образом, мы смотрим снова на сценарий и находим, где as_user () называют, и с который аргумент.

Некоторые из этих аргументов сложны с 3 уровнями выхода/заключения в кавычки, таким образом, они - подозреваемый.

Можно добавить простой отладочный оператор внутри 'as_user' как первая строка, прежде чем что-либо еще будет выполнено:

echo '$1 is:' $1

Который распечатал бы команду незадолго до отказа и сделал бы это очевидным, каков неверный аргумент.

В более общем плане: можно удобно отладить сценарии оболочки путем добавления прослеживающий (иначе 'эхо'). Просто измените 1-ю строку сценария к:

 #!/bin/bash -x

и каждая команда была бы распечатана непосредственно перед тем, как она выполняется, устанавливая связь между вызовом и очевидной ошибкой. Существует также-v (подробный), который распечатает каждую строку, поскольку она анализируется перед всеми history/command/param/file расширениями, но я нахожу-v намного менее полезный при отладке, чем-x. В редких случаях я просто использую обоих:-vx для отслеживания расширений, которые происходят перед выполнением подробно.

HTH

1
ответ дан 10 July 2012 в 07:18

После подсчета символов в Вашем сценарии (SMOP), я заметил, что у Вас было Нечетное число (49) из"'"символы. Вокруг строки 105, у Вас есть незавершенное"'":

as_user "screen -p 0 -S craftbukkit -X eval 'stuff \"say $SERVERNAME is shutting down in 30 seconds! Please stop what you are doing. Check back later, we'll be back!\"\015'"

Попытайтесь быть более формальными: "..., мы вернемся..."

Серьезно, одно незавершенное"'"перепутает парсинг остатка от сценария (где новое "соответствует"'"?).

Зафиксируйте это, затем используйте -x и -v, и читайте man bash.

1
ответ дан 10 July 2012 в 07:18

Другие вопросы по тегам:

Похожие вопросы: