Problème de if avec shell

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

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Salut,

    Manque le "then" attitude ;-))
    if [ "${string:$k:1}" = " " ]
    then echo ${string:$k+1};
    fi 
    1. Contributeur
      bonjour :)

      le fi, c'est quoi comme langage de prog ??
      1. Slt comme je le dit dans le titre je travail avec sur du shell
    2. 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.
      1. 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?
        1. 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