[ script shell ]
Résolu/Fermé
A voir également:
- [ script shell ]
- Script vidéo youtube - Guide
- Classic shell windows 11 - Télécharger - Personnalisation
- Microsoft activation script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Script cmd - Guide
11 réponses
jpzuate
Messages postés
56
Date d'inscription
dimanche 4 mars 2007
Statut
Contributeur
Dernière intervention
9 juin 2008
51
Modifié le 20 mars 2007 à 10:52
Modifié le 20 mars 2007 à 10:52
Voyons voyons ...
Je vais faire un peu mon casse pied mais j'ai 15 ans de shell (en production) derrière moi ;-)
1/ Met #!/usr/bin/bash au début du script comme conseillé, ça évitera des confusions du shell et de ceux qui tentent de le lire
2/ utilise la forme VARIABLE=$(commande) au lieu de VARIABLE='commande' pour des raisons de facilité de lecture (et c'est tellement vite fait d'oublier un ')
3/ until ça doit être comme while ou if, l'argument doit être en crochets et non entre parenthèses.
4/ utilise la syntaxe ${VARIABLE} au lieu de $VARIABLE : c'est plus propre et toujours pareil, on évite des confusions du lecteur et du shell
5/ Comment on différencie, d'un coup d'oeil, une commande d'une variable ? Parce qu'on met les variables en MAJUSCULE par exemple
6/ Le compteur :
7/ Dernier conseil d'écriture : l'identation c'est tellement plus pratique : ça structure la conception et surtout la lecture (et la relecture)
Dans les trucs que je signale beaucoup se prapprochent de l'écriture dite POSIX qui rend les programmes à peu près portable (au chemin des commandes et à leurs options près selon les unix ou les linux)
Bon courage
Jean-Pierre Zuate
Je vais faire un peu mon casse pied mais j'ai 15 ans de shell (en production) derrière moi ;-)
1/ Met #!/usr/bin/bash au début du script comme conseillé, ça évitera des confusions du shell et de ceux qui tentent de le lire
2/ utilise la forme VARIABLE=$(commande) au lieu de VARIABLE='commande' pour des raisons de facilité de lecture (et c'est tellement vite fait d'oublier un ')
3/ until ça doit être comme while ou if, l'argument doit être en crochets et non entre parenthèses.
4/ utilise la syntaxe ${VARIABLE} au lieu de $VARIABLE : c'est plus propre et toujours pareil, on évite des confusions du lecteur et du shell
5/ Comment on différencie, d'un coup d'oeil, une commande d'une variable ? Parce qu'on met les variables en MAJUSCULE par exemple
6/ Le compteur :
I=1 I=$(( ${I} + 1 )) echo ${I}I est bien égal à 2(oui oui, c'est magique ;-)
7/ Dernier conseil d'écriture : l'identation c'est tellement plus pratique : ça structure la conception et surtout la lecture (et la relecture)
Dans les trucs que je signale beaucoup se prapprochent de l'écriture dite POSIX qui rend les programmes à peu près portable (au chemin des commandes et à leurs options près selon les unix ou les linux)
Bon courage
Jean-Pierre Zuate
rer_louz
Messages postés
276
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
29 décembre 2008
71
19 mars 2007 à 15:13
19 mars 2007 à 15:13
Salut,
Etrange le coup de echo. As tu mis au debut de ton script "#!/bin/bash" ?
Sinon essayes echo -e "blablabla".
Pour l'addition i=$(($i + 1 )) ou quelque chose comme ca. Je m'en sers pas tous les jours. Ajoutes ou retires des espaces si ca marche pas du premier coups.
Bon courage.
A++
Etrange le coup de echo. As tu mis au debut de ton script "#!/bin/bash" ?
Sinon essayes echo -e "blablabla".
Pour l'addition i=$(($i + 1 )) ou quelque chose comme ca. Je m'en sers pas tous les jours. Ajoutes ou retires des espaces si ca marche pas du premier coups.
Bon courage.
A++
La fonction suivante ne marche toujours pas :
until { $I -lt $n }
do
echo "$a est $b depuis $c" | head -n $i | tail -n 1
I=$(( ${I} + 1 ))
echo $i
done
Le code d'erreur est :
./interface.sh: line 15: syntax error near unexpected token `do'
./interface.sh: line 15: `do'
until { $I -lt $n }
do
echo "$a est $b depuis $c" | head -n $i | tail -n 1
I=$(( ${I} + 1 ))
echo $i
done
Le code d'erreur est :
./interface.sh: line 15: syntax error near unexpected token `do'
./interface.sh: line 15: `do'
jpzuate
Messages postés
56
Date d'inscription
dimanche 4 mars 2007
Statut
Contributeur
Dernière intervention
9 juin 2008
51
Modifié le 20 mars 2007 à 10:52
Modifié le 20 mars 2007 à 10:52
Et oui, le shell se gourre rarement :
until, while et if = même combat. Ce sont des crochets qu'il faut ([]) et non des parenthèses ou des accolades ...
Et utiliser $i alors que tu manipules $I ça risque de ne pas marcher non plus (pour le post que tu fera dans 1 heure ou 2 ;-))
Jean-Pierre Zuate
until, while et if = même combat. Ce sont des crochets qu'il faut ([]) et non des parenthèses ou des accolades ...
Et utiliser $i alors que tu manipules $I ça risque de ne pas marcher non plus (pour le post que tu fera dans 1 heure ou 2 ;-))
Jean-Pierre Zuate
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Oups d'accord, j'avais mal lu pour les crochets :)
La phase de test fonctionne bien maintenant (pas de message d'erreur)
mais je n'obtiens rien en sortie d'éxécution du script.
J'ai mi des echo un peu partout pour savoir ou le script plante comme suit:
echo "debut de la boucle"
until [ $I -lt $n ]
echo "suite"
do
echo "suite de la boucle"
echo "$a est $b depuis $c" | head -n $I | tail -n 1
I=$(( ${I} + 1 ))
echo $I
done
La phrase "suite de la boucle" n'apparaît pas mais les précédentes si.
PS: J'avais corriger pour le $i, je m'étais rendu compte de mon erreur ;)
Merci encore pour votre aide
La phase de test fonctionne bien maintenant (pas de message d'erreur)
mais je n'obtiens rien en sortie d'éxécution du script.
J'ai mi des echo un peu partout pour savoir ou le script plante comme suit:
echo "debut de la boucle"
until [ $I -lt $n ]
echo "suite"
do
echo "suite de la boucle"
echo "$a est $b depuis $c" | head -n $I | tail -n 1
I=$(( ${I} + 1 ))
echo $I
done
La phrase "suite de la boucle" n'apparaît pas mais les précédentes si.
PS: J'avais corriger pour le $i, je m'étais rendu compte de mon erreur ;)
Merci encore pour votre aide
jpzuate
Messages postés
56
Date d'inscription
dimanche 4 mars 2007
Statut
Contributeur
Dernière intervention
9 juin 2008
51
Modifié le 20 mars 2007 à 10:52
Modifié le 20 mars 2007 à 10:52
Mettre un echo entre until et do, ça ne me parait pas bien clair.
Si le message "suite de la boucle" n'apparaît pas, c'est qu'il n'entre jamais dans la condition du until : avant même d'évaluer le until, la condition n'est pas remplie.
1/ Enlève le
2/ Remplace
Tu verra bien les valeurs de I et de n. Je mettrais (presque) ma main à couper que n vaut zéro ...
Jean-Pierre Zuate
Si le message "suite de la boucle" n'apparaît pas, c'est qu'il n'entre jamais dans la condition du until : avant même d'évaluer le until, la condition n'est pas remplie.
1/ Enlève le
echo "suite"
2/ Remplace
echo "debut de la boucle"par
echo "debut de la boucle $I $n"
Tu verra bien les valeurs de I et de n. Je mettrais (presque) ma main à couper que n vaut zéro ...
Jean-Pierre Zuate
J'obtiens ceci:
debut de la boucle 1 28
Mon n correspond bien à 28 donc en théorie je doit rentrer dans la boucle.
Je vais peut etre dire une bétise mais est il possible que mon n ne soit pas interpréter comme un nombre à cause de mon cut?
ou alors que le cut mette une "ligne vide" en dessous qui fait que je ne peux pas comparer?
debut de la boucle 1 28
Mon n correspond bien à 28 donc en théorie je doit rentrer dans la boucle.
Je vais peut etre dire une bétise mais est il possible que mon n ne soit pas interpréter comme un nombre à cause de mon cut?
ou alors que le cut mette une "ligne vide" en dessous qui fait que je ne peux pas comparer?
jpzuate
Messages postés
56
Date d'inscription
dimanche 4 mars 2007
Statut
Contributeur
Dernière intervention
9 juin 2008
51
Modifié le 20 mars 2007 à 10:52
Modifié le 20 mars 2007 à 10:52
Ce n'est pas la faute du cut sinon ton n ne sera pas remplis et s'il l'était avec un caractère alphanumérique le shell te le dirait (c'est dû à l'opérateur -lt qui ne concerne que les valeurs numériques).
Si I=1 et n=28 c'est normal qu'il n'entre pas dans le until [ $I -lt $n ]
Je crois que le dernier bug viens du mec qui est derrière le clavier :-)
Tu n'aurais pas un petit pb d'interprétation entre until et while ?
- until en gros ça veut dire "jusqu'à"
- while en gros ça veut dire "tant que"
dans ton cas c'est "tant que" qui t'intéresse, je pense (surtout que tu incrémente I).
Et dans le cas présent, puisque I <= (-lt) n, il n'entre pas dans le until (à cause du jusqu'à)
Jean-Pierre Zuate
Si I=1 et n=28 c'est normal qu'il n'entre pas dans le until [ $I -lt $n ]
Je crois que le dernier bug viens du mec qui est derrière le clavier :-)
Tu n'aurais pas un petit pb d'interprétation entre until et while ?
- until en gros ça veut dire "jusqu'à"
- while en gros ça veut dire "tant que"
dans ton cas c'est "tant que" qui t'intéresse, je pense (surtout que tu incrémente I).
Et dans le cas présent, puisque I <= (-lt) n, il n'entre pas dans le until (à cause du jusqu'à)
Jean-Pierre Zuate
J'ai remplacé le lt par un ge et la boucle marche coorectement mais j'ai toujours un soucis.
mon "echo "$a est $b depuis $c" | head -n $i | tail -n 1" ne fonctionne pas , seulement le contenu de $a s'affiche.
En utilisant la manip suivante, sa fonctionne mais tout ne s'affiche pas sur une ligne (sa me dérange pour l'incorporer dans nagios et pour ensuite peut être stocké ces valeurs dans un fichiers ou une chaine de caractères):
until [ $I -ge $n ]
do
echo "$a" | head -n $I | tail -n 1
echo "est"
echo "$b" | head -n $I | tail -n 1
echo "depuis"
echo "$c" | head -n $I | tail -n 1
I=$(( ${I} + 1 ))
done
mon "echo "$a est $b depuis $c" | head -n $i | tail -n 1" ne fonctionne pas , seulement le contenu de $a s'affiche.
En utilisant la manip suivante, sa fonctionne mais tout ne s'affiche pas sur une ligne (sa me dérange pour l'incorporer dans nagios et pour ensuite peut être stocké ces valeurs dans un fichiers ou une chaine de caractères):
until [ $I -ge $n ]
do
echo "$a" | head -n $I | tail -n 1
echo "est"
echo "$b" | head -n $I | tail -n 1
echo "depuis"
echo "$c" | head -n $I | tail -n 1
I=$(( ${I} + 1 ))
done
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
20 mars 2007 à 09:39
20 mars 2007 à 09:39
Salut,
A quoi ressemble la sortie de "echo $a", "echo $b" et "echo $c" ???
A mon avis il faut que tu crées une nouvelle variable ($newa, $newb, $newc) pour chaque variable ($a, $b, $c) afin de les traiter à chaque nouvelle itération de ta boucle :
;-))
A quoi ressemble la sortie de "echo $a", "echo $b" et "echo $c" ???
A mon avis il faut que tu crées une nouvelle variable ($newa, $newb, $newc) pour chaque variable ($a, $b, $c) afin de les traiter à chaque nouvelle itération de ta boucle :
newa=$(echo "$a" | head -n "$I" | tail -n 1) newb=$(echo "$b" | head -n "$I" | tail -n 1) newc=$(echo "$c" | head -n "$I" | tail -n 1) echo "$newa est $newb depuis $newc"En espérant avoir bien suivi...
;-))