web-dev-qa-db-fra.com

Erreur de syntaxe de script shell: Fin de fichier inattendue

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)
28
Rajeev

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 ifs et 4 fis. 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.

72
camh

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...

10
Praveen Rao K

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

4
shtolik

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)

4
David Gidony

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
3
patel8786
echo"==================PS COMMAND SNAPSHOT=============================================================="

doit être

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

Sinon, un programme ou une commande nommé echo"===... est recherché.

plus de problèmes:

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.

2
user unknown

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
2
ibaralf

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.

1
ams

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
0
pinkston00

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.

0
musthafa

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
0
Envite