Dans le script suivant, j'obtiens une erreur:
erreur de syntaxe: fin de fichier inattendue
Quelle est cette erreur comment puis-je le resove? Il pointe vers la ligne où la fonction est appelée.
#!/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)
Modifier: Notez que le message original a été modifié depuis que cette réponse a été écrite et reformatée. Vous devriez consulter l'historique pour voir le formatage d'origine afin de comprendre le contexte de cette réponse.
Cette erreur se produit souvent lorsque la structure ne correspond pas, c'est-à-dire que vous n'avez pas de guillemets doubles, de guillemets simples correspondants, que vous n'avez pas fermé une structure de contrôle telle qu'une fi
manquante avec une if
ou une done
manquante avec une for
.
La meilleure façon de les repérer est d'utiliser l'indentation correcte, ce qui vous indiquera où la structure de contrôle est cassée et la coloration syntaxique, ce qui vous indiquera où les guillemets ne correspondent pas.
Dans ce cas particulier, je peux voir qu'il vous manque une fi
. Dans la dernière partie de votre code, vous avez 5 if
s et 4 fi
s. Cependant, vous rencontrez également un certain nombre d'autres problèmes: votre commande __codetouch /tmp/alert.txt...
est désactive du point de vue de la syntaxe et vous avez besoin d'un espace avant le crochet de fermeture d'un test if
.
Nettoyez votre code et les erreurs commencent à se démarquer.
Dans mon cas, j’ai constaté que le fait de placer un document here (comme sqplus ... << EOF) indenté soulève également la même erreur que celle illustrée ci-dessous:
./dbuser_case.ksh: line 25: syntax error: unexpected end of file
Donc, après avoir supprimé l'indentation pour cela, tout s'est bien passé.
J'espère que ça aide...
J'ai eu ce problème lors de l'exécution d'un script dans cygwin. Correction en exécutant dos2unix
sur le script, avec une description correcte du problème et la solution donnée dans that answer
dans mon cas, le problème était dans la conversion EOL. (Fin de ligne).
j'ai créé le fichier sur Windows et seulement après avoir converti l'EOL de Windows (CR LF) en Unix (LF), tout s'est bien passé.
J'ai fait la conversion avec Notepad ++ très facilement à partir de: Éditer -> Conversion EOL -> Unix (LF)
J'ai constaté que cela est parfois dû à l'exécution d'une version MS DOS d'un fichier. Si tel est le cas, dos2ux devrait résoudre ce problème.
dos2ux file1 > file2
echo"==================PS COMMAND SNAPSHOT=============================================================="
doit être
echo "==================PS COMMAND SNAPSHOT=============================================================="
Sinon, un programme ou une commande nommé echo"===...
est recherché.
Si vous faites un grep (-A1: + contexte de ligne)
grep -A1 "if " cldtest.sh
vous trouvez des ifs incorporés, et 4 si/alors des blocs.
grep "fi " cldtest.sh
révèle seulement 3 déclarations fi correspondantes. Donc, vous avez oublié un fi aussi.
Je suis d’accord avec camh, le fait que le retrait correct du début aide à éviter de telles erreurs. Trouver le moyen souhaité ultérieurement signifie un double travail dans un tel code spaghetti.
L'indentation lors de l'utilisation d'un bloc peut causer cette erreur et est très difficile à trouver.
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
=> L'exemple ci-dessus provoquera une erreur car EOSQL est en retrait. Retirez l’indentation comme indiqué ci-dessous. Afficher ceci parce que cela m'a pris plus d'une heure pour comprendre l'erreur.
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
Vous avez une citation non fermée, une accolade, un support, si, une boucle ou quelque chose.
Si vous ne pouvez pas le voir simplement en regardant (je recommanderais un éditeur de coloration de syntaxe et un style d'indentation net), prenez une copie du script et supprimez la moitié de celui-ci, coupez-la en un endroit qui devrait être valide. Si le script s'exécute, dans la mesure du possible, le problème se situe dans l'autre moitié. Répétez jusqu'à ce que vous ayez réduit le problème.
Message utile, j'ai constaté que mon erreur utilisait else if
au lieu de Elif
comme ceci:
if [ -z "$VARIABLE1" ]; then
# do stuff
else if [ -z "$VARIABLE2" ]; then
# do other stuff
fi
Fixé en changeant à ceci:
if [ -z "$VARIABLE1" ]; then
# do stuff
Elif [ -z "$VARIABLE2" ]; then
# do other stuff
fi
J'ai rencontré la même erreur en essayant d'exécuter un fichier de script créé dans Windows OS à l'aide de textpad. de sorte que l'on puisse sélectionner le format de fichier approprié comme unix/mac, etc. ou recréer le script sous Linux lui-même.
Cela peut également être provoqué par le passage d'une paire d'accolades sur une ligne.
Cela échoue:
{ /usr/local/bin/mycommand ; outputstatus=$? } >> /var/log/mycommand.log 2>&1h
do_something
#Get NOW that saved output status for the following $? invocation
sh -c "exit $outputstatus"
do_something_more
alors que cela est autorisé:
{
/usr/local/bin/mycommand
outputstatus=$?
} >> /var/log/mycommand.log 2>&1h
do_something
#Get NOW that saved output status for the following $? invocation
sh -c "exit $outputstatus"
do_something_more