Problème de if avec shell

Fermé
nbonnet Messages postés 478 Date d'inscription jeudi 11 octobre 2007 Statut Membre Dernière intervention 4 septembre 2013 - 25 sept. 2009 à 11:50
nbonnet Messages postés 478 Date d'inscription jeudi 11 octobre 2007 Statut Membre Dernière intervention 4 septembre 2013 - 25 sept. 2009 à 16:09
Bonjour,

Voila j'aimerais faire de la tokenisation sur une chaine de caratère.

mon script donne :

down=`rrdtool fetch /usr/share/cacti/rra/phoebe_traffic_in_111.rrd MAX --start 1253743200 --end 1253743200`

function tokenize1 {
string="$1"
len="${#string}"

for (( k=0 ; k<$len ; k++))
do
if [ "${string:$k:1}" = " " ]
echo ${string:$k+1};
fi
done

}

tokenize1 "`echo $down`"




voici la réponse que j'ai :

./test_traffic-bis.sh: line 21: syntax error near unexpected token `fi'
./test_traffic-bis.sh: line 21: ` fi'


Je ne comprend pas ce qu'il cloche dans mon if. Pouvez vous m'aidez?
La chaine de caractère est celle-ci : traffic_in traffic_out 1253743500: 2.2048553575e+05 8.7238730288e+03


Merci d'avance
A voir également:

7 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
25 sept. 2009 à 11:55
Salut,

Manque le "then" attitude ;-))
if [ "${string:$k:1}" = " " ]
then echo ${string:$k+1};
fi 
1
jjsteing Messages postés 1669 Date d'inscription vendredi 11 mai 2007 Statut Contributeur Dernière intervention 21 mai 2012 181
25 sept. 2009 à 11:55
bonjour :)

le fi, c'est quoi comme langage de prog ??
0
nbonnet Messages postés 478 Date d'inscription jeudi 11 octobre 2007 Statut Membre Dernière intervention 4 septembre 2013 46
25 sept. 2009 à 14:15
Slt comme je le dit dans le titre je travail avec sur du shell
0
nbonnet Messages postés 478 Date d'inscription jeudi 11 octobre 2007 Statut Membre Dernière intervention 4 septembre 2013 46
25 sept. 2009 à 14:14
Oki merci effectivement ca marche mieux.

Mais maintenant j'aimerais faire un return plutot qu'un echo dans if pour sortir de ma boucle car sinon il me supprime toutes les valeurs et c'est pas ce que je veux.

Mon but est de faire appel à la fonction plusieurs fois pour garder les deux dernières valeurs de ma chaine.

mais quand je fait appel a ma fonction avec cette ligne :

inter1=tokenize1 "`echo $down`"


la réponse est :

./test_traffic-bis.sh: line 34: traffic_in traffic_out 1253743500: 2.2048553575e+05 8.7238730288e+03: command not found

pour moi je ne demande pas de faire ceci en tant que commande et je n'arrive pas à déterminer pourquoi il veut exécuter ceci.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 sept. 2009 à 14:22
inter1="tokenize1 \"`echo $down`\" "
?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
25 sept. 2009 à 14:28
et :
inter1="tokenize1 $down" 

Tout simplement, non ?
0
nbonnet Messages postés 478 Date d'inscription jeudi 11 octobre 2007 Statut Membre Dernière intervention 4 septembre 2013 46
25 sept. 2009 à 14:48
euh non car si je met les " avant le nom de la fonction et a la fin de la ligne le shell me le prend comme une chaine de caractère et ne va donc pas utiliser ma fonction.

j'ai essayé plusieurs config possible :

inter1=`tokenize1 $down`
inter1=tokenize1 \"`echo $down`\"
inter1=tokenize1(`echo $down`)
inter1=tokenize1($down)
inter1=tokenize1 $down

rien n'y change il ne m'affiche soit des lignes vides soit des "syntax error near unexpected token"


---------------------------------------------------------------------
La vie est-elle trop courte pour rester derrière son écran?
0
nbonnet Messages postés 478 Date d'inscription jeudi 11 octobre 2007 Statut Membre Dernière intervention 4 septembre 2013 46
25 sept. 2009 à 16:09
Bon j'ai trouvé la solution.

Premièrement le return ne renvoi que des ENTIER donc forcement ca génére une erreur.

Deuxièment il suffit pour récupérer une chaine de caractère d'utilisé une variable dans la fonction et de la réutiliser par la suite.

Enfin dans mon cas je voulais qu'une fois ma chaine renvoyé je sorte de ma boucle et donc de ma fonction j'ai utilisé un return mais sans l'exploiter.

Voici mon code final qui m'affiche donc les deux deerniers éléments de ma chaine de caractère.

down=`rrdtool fetch /usr/share/cacti/rra/phoebe_traffic_in_111.rrd MAX --start 1253743200 --end 1253743200`

function tokenize1 {
string="$1"
len="${#string}"

for (( k=0 ; k<$len ; k++))
do
if [ "${string:$k:1}" = " " ]
then
inter1="${string:$k+1}";
return
fi
done

}

function tokenize2 {
string="$1"
len="${#string}"

for (( k=0 ; k<$len ; k++))
do
if [ "${string:$k:1}" = " " ]
then
inter2="${string:0:$k}";
return
fi
done
}


tokenize1 "`echo $down`"
tokenize1 "`echo $inter1`"
tokenize1 "`echo $inter1`"
tokenize2 "`echo $inter1`"
tokenize1 "`echo $inter1`"

echo $inter1
echo $inter2
0