Messages d'eereurs en shell

Bnjour

Voilà, j'ai réalisé un script .sh en shell donc.
Lorsque je lance ma commande, j'obtiens un deux messages d'erreurs sur deux lignes différentes:

./dm.sh : line 60 unexpected EOF while looking for matching ``,
./dm.sh : line 70 : syntax error : unexpected end of file

Ma ligne 60 correspond à ceci:

echo "`head -$i ficIntermediaire | tail -i ficIntermediaire | cut -1,2,3 -d ";"` $quantiteTotale $montant"

et la ligne 72 n'est que la fin de mon script qui se termine par
exit 0.

J'ai du mal à décrypter les erreurs concernée, alors si qqn peut m'aideR.
Merci d'avance.
Configuration: Linux Debian
Mozilla 1.8.1.10

26 réponses

Résumé de la discussion

Plusieurs messages d'erreur signalent problèmes de syntaxe dans un script shell, avec « unexpected EOF » et « unexpected end of file » sur lignes impliquant echo et une commande associant head, tail et cut. Des explications suggèrent que l'erreur peut venir d'une fermeture de backticks ou de guillemets non appariés, ou d'une syntaxe incorrecte du cut, notamment l'oubli du -f et l'usage du -d ';'. Les échanges conseillent de tester la ligne en ligne de commande, de corriger la syntaxe du cut en utilisant cut -f 1,2,3 -d ';', et de vérifier les substitutions imbriquées des backticks. D'autres discussions évoquent l'indentation et les détails du script non affichés, rappelant que des fautes mineures peuvent masquer l'origine réelle d'un EOF.

Bobot (l’IA à votre service)
  1. Bonjour,
    il manque un $ dans le tail ?
    et pourquoi spécifie un fichier dans le tail ?, il prends ce que lui donne le pipe en entrée non ?

    --
    Tøƒ
    1. Ah oui exact merci.
      J'ai corrigé et j'obtiens toujours la même phrase d'erreur.

      Mon code est celui-ci:

      echo `head -$i ficIntermediaire | tail -$i |cut -1,2,3 -d ";"` $quantiteTotale $montant

      Sinon pour la fin de fichier, faut-il finir un script shell par une instruction spéciale autre que exit 0 ?
      1. une autre remarque, pourquoi tu fais tail -$i ?
        je suppose qu'en fait, tu veux récupérer la ièeme ligne, donc c'ets un tail -1 qu'il faut faire.
        Ton problème vient peut-être également de là car ta commande renvoie plusieur lignes

        --
        Tøƒ
        1. Je pense que l'erreur vient d'autre part mais je voudrais savoir quelle type d'erreur provoque ce message d'erreur.
          1. Je pense que le message est levé car la commande echo ne s'effectue pas correctement.

            --
            Tøƒ
        2. EN fait ce i est l'indice d'une boucle for.
          Le but de cette commande est d'extraire les champs 1, 2, 3 de la ième ligne d'un fichier.
          Donc à chaque tour de boucle le i est différent. Mais à chaque fois le résultat n'est qu'une ligne non?
          1. si tu fais head-$i, tu vas prendre les i première lignes
            ensuite le tail -1 va prendre la dernière ligne issues du head.
            l'argument du tail correspond aux nombres de lignes en partant de la fin que l'on conserve.
            --
            Tøƒ
        3. Ah oui d'accord merci en effet.
          Malgré la correction, le message d'erreur reste le même...
          1. As-tu tester ta ligne head -$i ficIntermediaire | tail -$i |cut -1,2,3 -d ";" dans un xterm ?
            en remplacant le i par 1?
            je l'ai fait vite fait, et je pense que tu as oublier le -f devant -1 dans le cut

            --
            Tøƒ
            1. Oui je viens de m'en apercevoir en effectuant ce test.
              Après correction, la commande fonctionne et le message d'erreur reste toujours le même lorsque j'exécute le script.
              1. J'ai écrit un script il n'y pas longtemps qui utilise exactement cette fonction
                je recherche ca et je te tiens au courant.

                --
                Tøƒ
                1. Je ne vois pas trop d edifférence avec le mien...
                  Que se passe t'il si tu mets juste head -$i ficIntermediaire | tail -$i |cut -1,2,3 -d ";" dans ton script, avant le echo par exemple ?

                  --
                  Tøƒ
                  1. Je suis en train de reconsidérer tout l'algorithme.
                    Merci encore je te tiens au courant.
                    1. Bon voilà j'ai réécrit un script tout propre. Le message d'erreur reste le même.
                      IL s'agirait d'un oubli de fermeture de `, de " ou d'autre chose.

                      Je me permets de poster le script entier, si quelqu'un voulait bien le tester chez lui pour voir s'il a le même message d'erreur.

                      Merci d'avance.
                      Ce script fait le bilan des ventes de tous les produits d'un magasin.

                      #! /bin/sh
                      #création de la variable qui contiendra la date courante
                      
                      date_du_jour=`date +"%D`
                      
                      
                      #création du fichier ventesdate_du_jour.txt
                      
                      touch ventes$date_du_jour.txt
                      
                      
                      
                      
                      #écriture des deux premières lignes dans le fichier
                      
                      echo "Etat des ventes du $date_du_jour" >>ventes$date_du_jour.txt
                      
                      echo "Reference	NomProduit  Prix  Quantite  Montant" >>ventes$date_du_jour
                      
                      
                      k=0
                      j=0
                      tailleTableau=0
                      
                      #pour i de a nbligneTotal
                      nbLigneTotal=`wc -l ventesJour.txt`
                      while [ i -le nbLigneTotal ]
                      do 
                      	#regouper ds chaque variable les noms prix
                      	reference=`head -$i ventesJour.txt | cut -f1 -d ";"`
                      	#verifier reference pas deja prise
                      	#tant que pas trouve dans tableau faire
                      	while [ tableau[j] -ne $reference ] || [ $j -lt tailleTableau ]
                      	do
                      		let j=$j+1
                      	done
                      	#si  j=tailleTableau alors pas trouve et on traite
                      	if [ $g -eq $tailleTableau ]
                      	then 
                      	
                      	
                      		nomProduit=`head -$i ventesJours.txt | cut -f2 -d ";"`
                      		prix=`head -$i ventesJour.txt | cut -f3 -d ";"`
                      
                      
                      		#regrouper lignes meme produit 
                      		quantite=`grep $reference ventesJour.txt | wc -l`
                      
                      		#calcul de montant
                      		let montant=$quantite*$prix
                      		tableau[k]=$reference
                      		let tailleTableau=$tailletableau+1
                      		let montantTotal=$montantTotal+$montant
                      		#ecriture de la ligne
                      		echo $reference     $nomProduit     $prix     $quantite     $montant
                      
                      		
                      	fi
                      	
                      	#sinon alors trouve donc on fait rien
                      	let i=$i+1
                      done
                      
                      #écrire Montant total des ventes du jour : $montantTotal
                      
                      echo "Montant total des ventes du jour :" $montantTotal
                      
                      exit 0
                      1. personne ? C'est surement une erreur toute bête de fermeture de balise mais j'ai beau tout relire je vois pas. Quelqu'un arrive à exécuter?
                        Merci d'avance
                        1. J'ai changé tout ça et même quelques autres trucs, toujours le même message d'erreur.
                          C'est la première fois que j'utilise les tableaux en shell peut-être les ai-je mal utilisés...
                          Le nouveau script:

                          ##!/bin/dm2
                          #création de la variable qui contiendra la date courante
                          date_du_jour=`date +"%D`
                          
                          
                          #création du fichier ventesdate_du_jour.txt
                          touch ventes$date_du_jour.txt
                          
                          
                          #écriture des deux premières lignes dans le fichier
                          echo "Etat des ventes du $date_du_jour" >> ventes$date_du_jour.txt
                          echo "Reference	NomProduit  Prix  Quantite  Montant" >> ventes$date_du_jour
                          
                          #initialisation des vraiables
                          k=0
                          j=0
                          i=0
                          montantTotal=0
                          
                          #pour i de 1 a nbligneTotal
                          nbLigneTotal=`cat ventesJour.txt | wc -l`
                          while [ $i -le $nbLigneTotal ]
                          do 
                          	#regouper dans chaque variable les noms prix
                          	reference=`head -$i ventesJour.txt | cut -f1 -d ";"`
                          	#verifier reference pas deja prise
                          	#tant que pas trouve dans tableau faire
                          	while [ $tableau[j] -ne $reference ] || [ $j -lt $k ]
                          	do
                          		let j=$j+1
                          	done
                          	#si  j=tailleTableau alors pas trouve et on traite
                          	if [ $j -eq $k ]
                          	then 
                          	
                          	
                          		nomProduit=`head -$i ventesJours.txt | cut -f2 -d ";"`
                          		prix=`head -$i ventesJour.txt | cut -f3 -d ";"`
                          
                          
                          		#regrouper lignes meme produit 
                          		quantite=`grep $reference ventesJour.txt | wc -l`
                          
                          		#calcul de montant
                          		let montant=$quantite*$prix
                          		tableau[k]=$reference
                          		let k=$k+1
                          		let montantTotal=$montantTotal+$montant
                          		#ecriture de la ligne
                          		echo $reference     $nomProduit     $prix     $quantite     $montant
                          
                          		
                          	fi
                          	
                          	#sinon alors trouve donc on fait rien
                          	let i=$i+1
                          done
                          
                          #écrire Montant total des ventes du jour : $montantTotal
                          echo "Montant total des ventes du jour : $montantTotal"
                          
                          exit 0
                          1. Attendez une seconde, un **** de guillemet était dans la création de la variable date_du_jour.
                            L'exécution m'affiche des messages d'erreurs plus explicites maintenant je vais les traiter et voir ce ça donne.
                            Je vous tiens au courant.
                            Merci.
                            1. Bon voilà plus qu'une erreur qui je pense doit être lié à ma syntaxe sur l'utilisation du tableau.
                              Voici le message d'erreur:

                              ./dm3.sh: line 28: [: [0]: unary operator expected

                              Peut-être que c'est parce que je n'ai pas initialisé la première case du tableau...
                              Quelqu'un a une idée?
                              Je remets le script en ciblant la ligne erreur:

                              #!/bin/dm2
                              #création de la variable qui contiendra la date courante
                              date_du_jour=`date +%D`
                              
                              
                              #création du fichier ventesdate_du_jour.txt
                              touch ventes_de_ce_jour.txt
                              
                              
                              #écriture des deux premières lignes dans le fichier
                              echo "Etat des ventes du $date_du_jour" >> ventes_de_ce_jour.txt
                              echo "Reference	NomProduit  Prix  Quantite  Montant" >> ventes_de_ce_jour.txt
                              
                              #initialisation des vraiables
                              k=0
                              j=0
                              i=0
                              montantTotal=0
                              
                              #pour i de 1 a nbligneTotal
                              nbLigneTotal=`cat ventesJour.txt | wc -l`
                              while [ $i -le $nbLigneTotal ]
                              do 
                              	#regouper dans chaque variable les noms prix
                              	reference=`head -$i ventesJour.txt | cut -f1 -d';'`
                              	#verifier reference pas deja prise
                              	#tant que pas trouve dans tableau faire
                              	while [ $tableau[$j] -ne $reference ] || [ $j -lt $k ]     <------------------------
                              	do
                              		let j=$j+1
                              	done
                              	#si  j=tailleTableau alors pas trouve et on traite
                              	if [ $j -eq $k ]
                              	then 
                              	
                              	
                              		nomProduit=`head -$i ventesJour.txt | cut -f2 -d ";"`
                              		prix=`head -$i ventesJour.txt | cut -f3 -d';'`
                              
                              
                              		#regrouper lignes meme produit 
                              		quantite=`grep $reference ventesJour.txt | wc -l`
                              
                              		#calcul de montant
                              		let montant=$quantite*$prix
                              		tableau[$k]=$reference
                              		let k=$k+1
                              		let montantTotal=$montantTotal+$montant
                              		#ecriture de la ligne
                              		echo "$reference     $nomProduit     $prix     $quantite     $montant" >> ventes_de_ce_jour.txt
                              
                              		
                              	fi
                              	
                              	#sinon alors trouve donc on fait rien
                              	let i=$i+1
                              done
                              
                              #écrire Montant total des ventes du jour : $montantTotal
                              echo "Montant total des ventes du jour : $montantTotal" >> ventes_de_ce_jour.txt
                              
                              exit 0
                              1. Modérateur
                                Est-ce qu'on peut avoir un aperçu de ce que contient "ventesJour.txt"...
                                1. Bien sûr:

                                  Ref;nomProduit;prix;qté

                                  8447457;Lot 10 Chemises;7;5
                                  8439991;Classeur levier;6;2
                                  8402060;Perforateur;3;1
                                  8404572;Gomme plastique;1;4
                                  8419837;Ciseaux Soft;5;1
                                  8445115;Papier 500 f.;7;2
                                  8428563;Etiquettes A4;8;1
                                  8453333;Cahier A4 96p.;4;5
                                  8453334;Cahier A4 192p.;5;4
                                  8404572;Gomme plastique;1;3
                                  8456422;Roller bleu;2;5
                                  8456423;Roller rouge;2;2
                                  8441139;Surligneur vert;1;3
                                  401797;Marqueur noir;1;1
                                  8434996;Correcteur;1;6
                                  8447457;Lot 10 Chemises;7;7
                                  8439991;Classeur levier;6;2
                                  8439991;Classeur levier;6;2
                                  8402060;Perforateur;3;1
                                  8453333;Cahier A4 96p.;4;10
                                  8419837;Ciseaux Soft;5;10
                                  8456422;Roller bleu;2;2
                                  8456422;Roller bleu;2;3
                                  8456423;Roller rouge;2;5
                                  8434996;Correcteur;1;2
                                  8447457;Lot 10 Chemises;7;5
                                  8445115;Papier 500 f.;7;1
                                  8453333;Cahier A4 96p.;4;6
                                  8456422;Roller bleu;2;1
                                  8434996;Correcteur;1;3
                                  1. Modérateur
                                    Bon déjà la syntaxe de la lecture d'un élément du tableau s'écrit plutôt comme ça "${tableau[$j]}".

                                    Ensuite, il vaudrait mieux je pense que tu nous donnes l'algorithme de ton script, parce que là c'est assez fiddicile à comprendre (du moins pour ma part) ;-(

                                    ;-))
                                    • 1
                                    • 2