Messages d'eereurs en shell
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
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.
-
PLutot
while [ ${tableau[$j]} -ne $reference ] || [ $j -lt $k ]
do
let j=$j+1
done -
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
-
Arg l'indentation est pas passée
-
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 -
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.-
ModérateurL'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 ;-)
-
-
ModérateurBon 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) ;-(
;-)) -
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 -
ModérateurEst-ce qu'on peut avoir un aperçu de ce que contient "ventesJour.txt"...
-
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
-
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. -
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
-
Okay.
Merci beaucoup.
Je m'occupe de ça. -
ModérateurSalut,
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...
-
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 -
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
-
Je suis en train de reconsidérer tout l'algorithme.
Merci encore je te tiens au courant. -
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øƒ -
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øƒ -
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. -
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