Posez votre question Signaler

[ script shell ] [Résolu]

jeremy - Dernière réponse le 20 mars 2007 à 10:52
Bonjour à tous,
Je souhaite créer un script (pour incorporer dans nagios) qui remonte le nom des interfaces, si elles sont up ou down et depuis combien de temps.
J'arrive à récupérer les infos mais pas à les mettre en forme.
Voici mon script:
n=`snmpget 10.63.1.63 -c public -v 2c interfaces.ifNumber.0 | cut -d "" -f 4` // récupération du nombre d'interfaces
a=`snmpwalk 10.63.1.63 -c public -v 2c interfaces.ifTable.ifEntry.ifDescr | cut -d " " -f 4 ` // récupération du nom des interfaces
b=`snmpwalk 10.63.1.53 -c public -v 2c 1.3.6.1.2.1.2.2.1.8 | cut -d " " -f 4 ` // récupération de l'état des interfaces
c=`snmpwalk 10.63.1.53 -c public -v 2c 1.3.6.1.2.1.2.2.1.9 | cut -d " " -f 5 ` //récupération de la durée de l'état
i=1
until ($i -lt $n) // cette comparaison ne fonctionne pas dans le script
do
echo "$a est $b depuis $c" | head -n $i | tail -n 1
# la commande echo ne fonctionne pas, elle affiche " est depuis |head -n $i | tail -n 1
i=$($i+1) // je n'incrémente pas i de 1 mais j'obtiens 1+1
echo $i
done
Merci d'avance pour votre aide
Lire la suite 

[ script shell ] »

11 réponses
Réponse
+3
moins plus
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 :
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
Ajouter un commentaire
Réponse
+0
moins plus
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++
Ajouter un commentaire
Réponse
+0
moins plus
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'
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
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
Ajouter un commentaire
Réponse
+0
moins plus
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?
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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 :
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...

;-))
Ajouter un commentaire
Réponse
+0
moins plus
merci beaucoup :)
Ajouter un commentaire
Ce document intitulé « [ script shell ] » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Windows 8 - À quoi s'attendre ?