Problème de if avec shell

nbonnet Messages postés 503 Statut Membre -  
nbonnet Messages postés 503 Statut Membre -
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
--
---------------------------------------------------------------------
La vie est-elle trop courte pour rester derrière son écran?
Configuration: Mac OS X
Firefox 3.5.3

7 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

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

    le fi, c'est quoi comme langage de prog ??
    0
    1. nbonnet Messages postés 503 Statut Membre 48
       
      Slt comme je le dit dans le titre je travail avec sur du shell
      0
  3. nbonnet Messages postés 503 Statut Membre 48
     
    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
  4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    inter1="tokenize1 \"`echo $down`\" "
    ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    et :
    inter1="tokenize1 $down" 

    Tout simplement, non ?
    0
  7. nbonnet Messages postés 503 Statut Membre 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
  8. nbonnet Messages postés 503 Statut Membre 48
     
    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