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