Problème de if avec shell

nbonnet Messages postés 478 Date d'inscription   Statut Membre Dernière intervention   -  
nbonnet Messages postés 478 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Modérateur Dernière intervention   4 896
 
Salut,

Manque le "then" attitude ;-))
if [ "${string:$k:1}" = " " ]
then echo ${string:$k+1};
fi 
1
jjsteing Messages postés 1670 Date d'inscription   Statut Contributeur Dernière intervention   181
 
bonjour :)

le fi, c'est quoi comme langage de prog ??
0
nbonnet Messages postés 478 Date d'inscription   Statut Membre Dernière intervention   46
 
Slt comme je le dit dans le titre je travail avec sur du shell
0
nbonnet Messages postés 478 Date d'inscription   Statut Membre Dernière intervention   46
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Modérateur Dernière intervention   4 896
 
et :
inter1="tokenize1 $down" 

Tout simplement, non ?
0
nbonnet Messages postés 478 Date d'inscription   Statut Membre Dernière intervention   46
 
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   Statut Membre Dernière intervention   46
 
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