shell - then - syntax error(unexpected bash
Error de sintaxis de script de shell: Fin de archivo inesperado (10)
En el siguiente script me sale un error:
error de sintaxis: final inesperado del archivo
¿Qué es este error? ¿Cómo puedo borrarlo? Está apuntando a la línea por la cual se llama la función.
#!/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)
Descubrí que esto se debe a veces al ejecutar una versión MS Dos de un archivo. Si ese es el caso, dos2ux debería arreglar eso.
dos2ux file1 > file2
Edición: tenga en cuenta que la publicación original se ha editado desde que esta respuesta se escribió y se ha reformateado. Debe mirar el historial para ver el formato original para comprender el contexto de esta respuesta.
Este error ocurre a menudo cuando tiene una estructura no coincidente, es decir, no tiene comillas dobles coincidentes, comillas simples coincidentes, no ha cerrado una estructura de control, como un fi
faltante con un if
, o un faltante done
con un for
.
La mejor manera de detectarlos es usar la sangría correcta, que le mostrará dónde tiene una estructura de control rota y el resaltado de sintaxis, que le mostrará dónde no se comparan las comillas.
En este caso particular, puedo ver que te estás perdiendo una fi
. En la última parte de su código, tiene 5 if
sy 4 fi
s. Sin embargo, también tiene una serie de otros problemas: el comando touch /tmp/alert.txt...
es sintácticamente válido y necesita un espacio antes del corchete de cierre de una prueba if
.
Limpia tu código, y los errores comienzan a destacar.
En mi caso, el problema estaba en la conversión EOL. (Fin de la línea).
Creé el archivo en Windows y solo después de convertir el EOL de Windows (CR LF) a Unix (LF), todo salió bien.
Hice la conversión con Notepad ++ muy fácilmente desde: Editar -> Conversión EOL -> Unix (LF)
En mi caso, encontré que colocar un documento aquí (como sqplus ... << EOF) las declaraciones con sangría también generan el mismo error que se muestra a continuación:
./dbuser_case.ksh: line 25: syntax error: unexpected end of file
Así que después de quitar la sangría para esto, entonces salió bien.
Espero eso ayude...
La sangría al usar un bloque puede causar este error y es muy difícil de encontrar.
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
=> El ejemplo anterior causará un error porque EOSQL tiene sangría. Elimine la sangría como se muestra a continuación. Publicar esto porque me llevó más de una hora descubrir el error.
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
Me he encontrado con el mismo error al intentar ejecutar un archivo de script creado en el sistema operativo Windows con el teclado de texto. para que uno pueda seleccionar el formato de archivo adecuado como Unix / Mac, etc. o recrear el script en Linux por sí mismo.
Publicación útil, encontré que mi error estaba usando else if
lugar de elif
así:
if [ -z "$VARIABLE1" ]; then
# do stuff
else if [ -z "$VARIABLE2" ]; then
# do other stuff
fi
Se corrigió cambiando a esto:
if [ -z "$VARIABLE1" ]; then
# do stuff
elif [ -z "$VARIABLE2" ]; then
# do other stuff
fi
Tienes una cita no escrita, corchete, corchete, si, bucle o algo.
Si no puede verlo con solo mirar (recomendaría un editor de color de sintaxis y un estilo de sangrado limpio), tome una copia del script y elimine la mitad, eliminándolo de algún lugar que debería ser válido. Si el script se ejecuta, en la medida de lo posible, entonces el problema está en la otra mitad. Repita hasta que haya reducido el problema.
Tuve este problema al ejecutar un script en cygwin. Se dos2unix
ejecutando dos2unix
en el script, con la descripción adecuada del problema y la solución dada en esa respuesta
echo"==================PS COMMAND SNAPSHOT=============================================================="
necesita ser
echo "==================PS COMMAND SNAPSHOT=============================================================="
De lo contrario, se busca un programa o comando llamado echo"===...
mas problemas:
Si haces un grep (-A1: contexto de línea + 1)
grep -A1 "if " cldtest.sh
encuentra algunos ifs incrustados y 4 bloques if / then.
grep "fi " cldtest.sh
solo revela 3 sentencias fi coincidentes. Así que se te olvidó una fi también.
Estoy de acuerdo con camh, que la sangría correcta desde el principio ayuda a evitar tales errores. Encontrar la forma deseada más tarde significa doble trabajo en dicho código de espagueti.