unexpected then script expecting error end shell sh

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.