Shell Script Ошибка синтаксиса: неожиданный конец файла

В следующем script я получаю сообщение об ошибке:

Синтаксическая ошибка: неожиданный конец файла

Какова эта ошибка, как я могу ее переустановить? Он указывает на строку, называемую функцией.

#!/bin/sh

expected_diskusage="264"
expected_dbconn="25"
expected_httpdconn="20"
expected_cpuusage="95"
#expected_fd="100"

httpdconn=`ps -ef|grep -i httpd|grep -v grep|wc -l` #httpd connections
cpu_usage=`ps aux|awk 'NR > 0 { s +=$3 }; END {print s}'`
disk_usage=`df -h|awk {'print $2'}|head -n3|awk 'NF{s=$0}END{print s}'`
#db_connections=`mysql -uroot -pexxxxxx -s -N -e "show processlist"|wc -l`

db_connections=6
cld_alert()
{
    nwconn=$1
    cpu_usage=$2
    disk_usage=$3
    db_connections=$4
    message=$5
    `touch /tmp/alert.txt && > /tmp/alert.txt`
    date=`date`
    echo -e "$date\n" > /tmp/alert.txt
    echo -e "$message" >> /tmp/alert.txt
    path="/proc/$httpd/fd/";
    cd $path
    tfd=`ls -l|wc -l`;
    sfd=`ls -ltr|grep sock|wc -l`;
    echo "Total fds: $tfd" >> /tmp/alert.txt
    echo "Socket fds: $sfd" >> /tmp/alert.txt
    echo "Other fds: $[$tfd - $sfd]" >> /tmp/alert.txt


    freememory=`vmstat | awk '{if (NR == 3) print "Free Memory:"\$4}'`;
    echo "Free memory :$freememory" >> /tmp/alert.txt
    Bufferedmemory=`vmstat | awk '{if (NR == 3) print "Buffered Memory:"\$5}'`;
    echo "Buffered memory $Bufferedmemory" >> /tmp/alert.txt
    CacheMemory=`vmstat | awk '{if (NR == 3) print "Cache Memory:"\$6}'`;
    echo "Cache memory : $CacheMemory" >> /tmp/alert.txt
    sshconn=`netstat -an|grep 22|wc -l`  #ssh connections
    httpsconn=`netstat -an|grep 443|wc -l`  #https connections
    wwwconn=`netstat -an|grep 80|wc -l`  #www connections
    echo "Disk usage is $disk_usage" >> /tmp/alert.txt
    echo "DB connections $db_connections" >> /tmp/alert.txt
    echo "Network connections $nwconn" >> /tmp/alert.txt
    echo "CPU Usage: $cpu_usage" >> /tmp/alert.txt
    topsnapshot=`top -n 1 -b`
    echo "===========================TOP COMMAND    SNAPSHOT====================================================";
    echo "$topsnapshot" >> /tmp/alert.txt
    echo"==================PS COMMAND SNAPSHOT=============================================================="
    entireprocesslist=`ps -ef`
    echo "$entireprocesslist" >> /tmp/alert.txt


    echo Hello hi"";

}



message=""
if [ ${disk_usage%?} -le $expected_diskusage ]    ##{x%?} Removes last character
then
    echo "disk usage exceeded";
    message="Disk usage limit exceeded \nCurrent disk usage is $disk_usage\nConfigured disk usage is    $expected_diskusage\n\n\n\n\n";
    #Checking for CPU usage
    if [ $cpu_usage -ge $expected_cpuusage]    ##{x%?}
    then
        echo "CPU usage exceeded";
        if [ $message -ne "" ]
        then
            message="$message\n\nCPU usage exceeded configured usage limit \nCurrent CPU usage is $cpu_usage\nConfigured CPU usage is $expected_cpuusage\n\n\n\n\n";
        else
            message="CPU usage exceeded configured usage limit \nCurrent CPU usage is   $cpu_usage\nConfigured CPU usage is $expected_cpuusage\n\n\n\n\n";
        fi ;
    fi
    #Checking for httpd connections
    if [ $httpdconn -ge $expected_httpdconn]    ##{x%?}
    then
        echo "HTTPD connections exceeded";
        if [ $message -ne "" ]
        then
            message="$message\n\nHTTPD connections exceeded configured usage limit \nCurrent HTTPD connections is $httpdconn\nConfigured HTTPD connection is $expected_httpdconn";
        else
            message="HTTPD connections exceeded configured usage limit \nCurrent HTTPD connections is $httpdconn\nConfigured HTTPD connection is $expected_httpdconn";
        fi ;
    fi ;
    message="$message\n\n\n\n\n";
    value=$(cld_alert $message $httpdconn $cpu_usage $disk_usage $db_connections)

Ответ 1

Изменить: обратите внимание, что исходное сообщение было отредактировано, так как этот ответ был написан и был переформатирован. Вы должны посмотреть на историю, чтобы увидеть исходное форматирование, чтобы понять контекст для этого ответа.

Эта ошибка возникает часто, когда у вас есть несогласованная структура, то есть у вас нет соответствующих двойных кавычек, соответствующих одинарным кавычкам, не закрыты структура управления, например, отсутствует fi с if или отсутствует done с for.

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

В этом конкретном случае я вижу, что вам не хватает fi. В последней части вашего кода у вас есть 5 if и 4 fi s. Однако у вас также есть ряд других проблем: ваша команда backquoted touch /tmp/alert.txt... синтаксически недействительна, и вам нужно пространство перед закрывающей скобкой теста if.

Очистите свой код, и ошибки начинают выделяться.

Ответ 2

В моем случае я обнаружил, что размещение здесь документа (например, sqplus... < < EOF) с отступом также приводит к той же ошибке, что и показано ниже:

./dbuser_case.ksh: line 25: syntax error: unexpected end of file

Итак, после удаления отступа для этого, он прошел нормально.

Надеюсь, что это поможет...

Ответ 3

У меня была эта проблема при запуске некоторого script в cygwin. Исправлено при запуске dos2unix на script, с правильным описанием проблемы и решения, указанными в которые отвечают

Ответ 4

Я обнаружил, что это иногда вызвано запуском версии файла MS Dos. Если этот аргумент dos2ux должен исправить это.

dos2ux file1 > file2

Ответ 5

echo"==================PS COMMAND SNAPSHOT=============================================================="

должно быть

echo "==================PS COMMAND SNAPSHOT=============================================================="

Else, выполняется поиск программы или команды с именем echo"===....

больше проблем:

Если вы используете контекст grep (-A1: + 1)

grep -A1 "if " cldtest.sh 

вы найдете некоторые встроенные ifs и 4 if/then blocks.

grep "fi " cldtest.sh 

показывает только 3 сопоставленных оператора. Таким образом, вы тоже забыли один финал.

Я согласен с camh, что правильный отступ с самого начала помогает избежать таких ошибок. Поиск нужного пути позже означает двойную работу в таком спагетти-коде.

Ответ 6

У вас есть закрытая цитата, скобка, скобка, если, цикл или что-то еще.

Если вы не можете увидеть это просто, посмотрев (я бы рекомендовал редактор раскраски синтаксиса и чистый стиль отступов), возьмите копию script и удалите ее половину, разрежьте ее где-нибудь, что должно чтобы быть действительным. Если script работает, насколько это возможно, тогда проблема находится в другой половине. Повторяйте, пока вы не уменьшите проблему.

Ответ 7

Полезный пост, я обнаружил, что моя ошибка использовала else if вместо elif так:

if [ -z "$VARIABLE1" ]; then
    # do stuff
else if [ -z "$VARIABLE2" ]; then
    # do other stuff
fi

Исправлено, изменив на это:

if [ -z "$VARIABLE1" ]; then
    # do stuff
elif [ -z "$VARIABLE2" ]; then
    # do other stuff
fi

Ответ 8

Я столкнулся с той же ошибкой при попытке выполнить файл script, созданный в ОС Windows, с помощью текстовой панели. так что можно выбрать правильный формат файла, такой как unix/mac и т.д., или воссоздать script в linux iteself.

Ответ 9

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

if [ ! -d /var/lib/mysql/mysql ]; then
   /usr/bin/mysql --protocol=socket --user root << EOSQL
        SET @@SESSION.SQL_LOG_BIN=0;
        CREATE USER 'root'@'%';
   EOSQL
fi

= > Пример выше приведет к ошибке, поскольку EOSQL имеет отступ. Удалите углубление, как показано ниже. Проводя это, потому что мне понадобилось больше часа, чтобы выяснить ошибку.

if [ ! -d /var/lib/mysql/mysql ]; then
   /usr/bin/mysql --protocol=socket --user root << EOSQL
        SET @@SESSION.SQL_LOG_BIN=0;
        CREATE USER 'root'@'%';
EOSQL
fi