скрипт bash, строка 30: синтаксическая ошибка: неожиданный конец файла - PullRequest
2 голосов
/ 27 октября 2010

Я написал какой-то скрипт и у меня неожиданный конец файла

echo off
if [$JAVA_HOME = ""]; then goto no_java_home fi
if [$SRV_HOME = ""]; then  goto no_srv_home fi
echo Uses JAVA_HOME=$JAVA_HOME
echo Uses SRV_HOME=$SRV_HOME
export ACP=""
export ACP=$ACP;$JAVA_HOME/lib/tools.jar
export ACP=$ACP;$SRV_HOME/ant/lib/ant.jar
export ACP=$ACP;$SRV_HOME/ant/lib/ant-launcher.jar
export ACP=$ACP;$SRV_HOME/ant/lib/ant-nodeps.jar
export ACP=$ACP;$SRV_HOME/ant/lib/optional.jar
export ACP=$ACP;$SRV_HOME/ant/lib/ant-contrib-1.0b3.jar
$JAVA_HOME/bin/java -Xmx512m -classpath $ACP org.apache.tools.ant.Main -buildfile $SRV_HOME/ant/ant_script.xml %*
goto ends

no_srv_home:
clear
echo "You should set the TMX_HOME environment variable. For example: TMX_HOME=d:\MYSERVER"
goto ends

no_java_home:
clear
echo "You should set the JAVA_HOME environment variable"
goto ends
ends: echo "OK"

Где моя проблема?

Ответы [ 3 ]

4 голосов
/ 28 октября 2010

Ваша проблема в том, что ваш скрипт выглядит как случайное сочетание синтаксиса bash и cmd. Вот скрипт bash.

if [ "$JAVA_HOME" = "" ]; then
  echo 1>&2 "$0: You need to set the JAVA_HOME variable, e.g.: export JAVA_HOME='c:/java'"
  exit 2
fi
if [ "$SRV_HOME" = "" ]; then
  echo 1>&2 "$0: You need to set the SRV_HOME variable, e.g.: export SRV_HOME='d:/myserver'"
  exit 2
fi
echo "$0: Uses JAVA_HOME=$JAVA_HOME"
echo "$0: Uses SRV_HOME=$SRV_HOME"
ACP="$JAVA_HOME/lib/tools.jar"
for x in ant ant-launcher ant-nodeps optional ant-contrib-1.0b3; do
  ACP="$ACP;$SRV_HOME/ant/lib/$x.jar"
done
"$JAVA_HOME/bin/java" -Xmx512m -classpath "$ACP" \
                      org.apache.tools.ant.Main \
                      -buildfile "$SRV_HOME/ant/ant_script.xml" \
                      "$@"

Вот список вещей, которые я исправил:

  • Bash имеет структурированные программные конструкции (блоки, условные выражения, циклы). Это не имеет goto.
  • Команда проверки [ … ] требует пробелов с каждой стороны скобок (кроме знаков пунктуации, таких как ;).
  • Все замены переменных ($foo) должны быть в двойных кавычках (в противном случае оболочка будет делать странные вещи, если значение переменной содержит определенные специальные символы, такие как пробелы).
  • Сообщения об ошибках должны отображаться на выходе ошибки: echo 1>&2 "this is an error message". (Это относится и к сценарию cmd.)
  • Если произошла ошибка, скрипт должен вернуть ненулевой статус. (Это относится и к сценарию cmd.)
  • Поскольку ACP является внутренней переменной сценария, нет необходимости экспортировать ее в среду.
  • ; - это специальный символ, поэтому его необходимо заключать в кавычки, если вы хотите использовать его в строке.
  • (Необязательно) Вы можете избежать многократного повторения одной и той же строки с помощью цикла (циклы в bash не имеют сумасшедших ограничений, которые они имеют в cmd).
  • Cmd %* - это bash's "$@".
  • (Необязательно) Если ваш скрипт вызывается другим скриптом, который вызывается и т. Д., Желательно иметь имя скрипта $0 в каждом сообщении об ошибке.
  • (Необязательно) Вы можете разбить длинную командную строку с обратной косой чертой в конце строки.
2 голосов
/ 27 октября 2010

Goto, правда?

Измените ваши операторы if, чтобы добавить точку с запятой до fi

if [$JAVA_HOME = ""]; then goto no_java_home ; fi

, например.

Ваша оболочка не может различитькоманда no_java_home и команда fi, потому что они отображаются в одной строке без разделителя точки с запятой или чего-либо еще, что могло бы завершить оператор.У вас та же проблема на ваших линиях с четким эхом;что касается sh, здесь эхо используется как аргумент для очистки и не является отдельной командой.

Но, пожалуйста, перепишите это без использования goto!

Вот так:

if [$JAVA_HOME = ""] ; then
        clear
        echo "You should set the JAVA_HOME environment variable"
elif [$SRV_HOME = ""] ; then
        clear
        echo "You should set the TMX_HOME environment variable. For example: TMX_HOME=d:\MYSERVER"
else
        echo Uses JAVA_HOME=$JAVA_HOME

        echo Uses SRV_HOME=$SRV_HOME

        export ACP=""

        export ACP=$ACP;$JAVA_HOME/lib/tools.jar

        export ACP=$ACP;$SRV_HOME/ant/lib/ant.jar

        export ACP=$ACP;$SRV_HOME/ant/lib/ant-launcher.jar

        export ACP=$ACP;$SRV_HOME/ant/lib/ant-nodeps.jar

        export ACP=$ACP;$SRV_HOME/ant/lib/optional.jar

        export ACP=$ACP;$SRV_HOME/ant/lib/ant-contrib-1.0b3.jar

        $JAVA_HOME/bin/java -Xmx512m -classpath $ACP org.apache.tools.ant.Main -buildfile

        $SRV_HOME/ant/ant_script.xml %*
fi

echo "OK"
0 голосов
/ 27 октября 2010

Если я переписываю следующие строки по-другому, неожиданная ошибка конца файла пропадает.

Исходная строка:

if [$JAVA_HOME = ""]; then goto no_java_home fi    
if [$SRV_HOME = ""]; then goto no_srv_home fi 

Обновлен:

if [$JAVA_HOME = ""]; then 
  goto no_java_home 
fi

if [$SRV_HOME = ""]; then 
  goto no_srv_home 
fi 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...