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

    while [ ${tableau[$j]} -ne $reference ] || [ $j -lt $k ]
    do
    let j=$j+1
    done
    1. Mais il semblerait que l'erreur se trouve sur le test du second while :

      while [ $tableau[$j] -ne $reference ] || [ $j -lt $k ]
      	do
      		let j=$j+1
      	done
      1. DEBUT
        #création du fichier ventesdate_du_jour.txt

        #écriture des deux premières lignes dans le fichier
        afficher("blablabla")
        afficher("blablabla")

        #initialisation des vraiables
        k <--0
        j <--0
        i <-- 0
        montantTotal <--0
        tableau <-- 0

        tant que (i <= nbLignes du fichier ventesJour.txt)
        faire
        reference <-- (la reference du produyit de la ligne i)
        #verification que referejnce n'a pas deja ete traitee
        tant que ((tableau[j] != reference) OU ( j < k )
        faire
        j++
        ftq

        #si j=tailleTableau alors reference pas trouvee et on la traite
        si ( j = k ) alors
        traitement des montants et quantites
        fsi

        #on passe a la ligne suivante
        i++
        ftq

        FIN
        1. L'algo est dans les commentaires. Dans un éditeur qui colore les lignes c'est lisible.
          EN effet j'ai changé la lecture d'un élément du tableau.

          Le message d'erreur reste : unary operator expected

          Pourtant j'ai essayé d'initialiser la première case du tableau.
          1. Modérateur
            L'algo est dans les commentaires
            Oui ça j'avais vu, mais comme c'est pas très clair pour moi...

            Reprends chaque ligne de commentaire et en regard mets ce que tu veux (voudrais) obtenir (en extrapolant le résultat des variables en fonction de celles sont sensées contenir) s'il te plaît, merci ;-)
        2. 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. 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
              Est-ce qu'on peut avoir un aperçu de ce que contient "ventesJour.txt"...
              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. 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. 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. Modérateur
                      Salut,

                      Déjà il y a une erreur dans : nbLigneTotal=`wc -l ventesJour.txt`
                      La sortie de cette commande ne renvoie pas un nombre seul, mais un nombre suivi du nom du fichier, donc forcément le test qui s'en suit foire ;-((

                      Mieux vaut utiliser la syntaxe : cat ventesJour.txt | wc -l

                      Autre chose, mieux vaut privilégier la syntaxe $(commande) plutôt que l'emploi des quotes inversées `commande`...
                      donc :
                      nbLigneTotal=$(cat ventesJour.txt | wc -l)
                      et dans le même esprit :
                      date_du_jour=$(date +"%D)

                      Il y a aussi une erreur dans le test suivant : while [ i -le nbLigneTotal ]
                      Il manque le signe "$" à ta variable "while [ i -le $nbLigneTotal ]"

                      Change ça déjà et puis on verra...

                      1. Et jipicy arriva !
                        Je ne suis qu'un jeune padawan en shell à coté de toi !
                        Tu m'avais pas mal dépanné il y a quelques mois.
                        =o)
                        --
                        Tøƒ
                    2. 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. 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. Je suis en train de reconsidérer tout l'algorithme.
                          Merci encore je te tiens au courant.
                          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. 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. 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. 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
                                  • 2