2016-08-11 2 views
0

Я пытаюсь скомпилировать мой скрипт Bash, но я продолжаю получать эту синтаксическую ошибку, даже если я следую правильному синтаксису.Запуск сценария Bash с правильным синтаксисом, но он продолжает давать мне синтаксическую ошибку

Код:

#!/bin/sh 
set -u 
SERVICE_NAME=Server 
PATH_TO_JAR=/usr/local/MyProject/MyJar.jar 
PID_PATH_NAME=/tmp/Server-pid 
case $1 in 
    start) 
        echo "Starting $SERVICE_NAME ..." 
     if [ ! -f "$PID_PATH_NAME" ]; then 
      nohup java -cp '/home/ubuntu/ResumeParser/ResumeParser/ResumeTransducerbin/* :/home/ubuntu/ResumeParser/ResumeParser/GATEFiles/lib/*:/home/ubuntu/.../ServerTest' /tmp 2>> /dev/null >> /dev/null & 
                        echo $! > $PID_PATH_NAME 
            echo "$SERVICE_NAME started ..." 
        else 
            echo "$SERVICE_NAME is already running ..." 
        fi 
    ;; 
    stop) 
        if [ -f $PID_PATH_NAME ]; then 
            PID=$(cat $PID_PATH_NAME); 
            echo "$SERVICE_NAME stoping ..." 
            kill $PID; 
            echo "$SERVICE_NAME stopped ..." 
            rm $PID_PATH_NAME 
        else 
            echo "$SERVICE_NAME is not running ..." 
        fi 
    ;; 
    restart) 
        if [ -f $PID_PATH_NAME ]; then 
            PID=$(cat $PID_PATH_NAME); 
            echo "$SERVICE_NAME stopping ..."; 
            kill $PID; 
            echo "$SERVICE_NAME stopped ..."; 
            rm $PID_PATH_NAME 
            echo "$SERVICE_NAME starting ..." 
            nohup java -cp '/home/ubuntu/ResumeParser/ResumeParser/ResumeTransducerbin/*:/home/ubuntu/... ServerTest' /tmp 2>> /dev/null >> /dev/null & 
                        echo $! > $PID_PATH_NAME 
            echo "$SERVICE_NAME started ..." 
        else 
            echo "$SERVICE_NAME is not running ..." 
        fi 
    ;; 
esac 
  

Когда я бегу: запустить Sudo службы сервера

/etc/init.d/Server: 9: /etc/init.d/Server: Syntax error: "then" unexpected  (expecting ";;") 

Когда я бегу: Баш -n Сервер

Server: line 9: syntax error near unexpected token `then' 
Server: line 9: `     if [ ! -f $PID_PATH_NAME ]; then' 

Что я делаю неправильно?

+0

У вас есть 'случай ... esac' над' if' заявление? Возможно, «esac» отсутствует или съеден некоторыми незакрытыми кавычками. –

+0

Как вы получаете одну ошибку «ИЛИ» другую ошибку? Почему вы не просто получаете один или оба? –

+0

SERVICE_NAME = Сервер PID_PATH_NAME =/TMP/Server-PID случай $ 1 в старте) эхо "Начиная $ SERVICE_NAME ..." если [! -f "$ PID_PATH_NAME"]; затем nohup java -cp '/home/ubuntu/.../ServerTest/tmp 2 >>/dev/null >>/dev/null & echo $! > $ PID_PATH_NAME echo "$ SERVICE_NAME начато ..." еще echo "$ SERVICE_NAME уже работает ..." фи ;; ГЗС ошибки я вижу - $ Sudo служба сервер начинает /etc/init.d/Server: 9: /etc/init.d/Server: Синтаксическая ошибка: " а затем" неожиданный (ожидающий «;;») – srao

ответ

0

Крэш может произойти PID_PATH_NAME пуст/не определено или даже имеет пробелы в нем

Shell видит, что, как if [ ! ]; then

Предпочитают

if [ ! -f "$PID_PATH_NAME" ]; then 

Кроме того, если PID_PATH_NAME имеет шанс быть пустым , вместо того, чтобы получать странное поведение (тестирование, если существует пустое имя файла, всегда неверно), вы можете проверить, как это, до тестирования, если файл существует:

В этом случае я адаптировал его к аргументу разбору, потому что если вы не передаете никакого аргумента в сценарий он не в не очень удобный для пользователя способа:

if [ -z "$1" ]; then 
    echo "no command defined: should be start, restart, stop. Aborting" 
    exit 1 
fi 
+0

Моя мысль точно! Имена файлов хороши, чтобы они всегда окружали с помощью '' '. – svante

+1

Если вы их протестируете, вы обнаружите, что' [!] 'И' [! -f] 'и' [! -f ""] 'все допустимые тестовые команды и не вызывают ошибок.Они могут не быть командами_useful_ test, но они не являются синтаксическими ошибками, которые могут вызвать сообщение об ошибке. – John1024

+0

Итак, это не основная причина. Вы правы, мы должны увидеть полный файл, должно быть чем-то до этого. –

1

Не уверены, что ценности $PID_PATH_NAME или попробуйте, если [ ! -f "$PID_PATH_NAME" ]; -> чтобы убедиться, что PID_PATH_NAME не добавляет дополнительных атрибутов/символов.

Но я бы предложил запустить статический инструмент в сценариях shell/bash, чтобы найти сумасшедшие/простые проблемы, подобные этому.

Static tool to verify shell scripts syntax

+0

Инструмент помог мне определить unicode, не разрывающие пробелы, которые были вставлены моим Спасибо, сейчас! – srao

0

вам нужно иметь

# Source function library. 
. /etc/init.d/functions 

перед сазе

 Смежные вопросы

  • Нет связанных вопросов^_^