Forum Programmation.shell Chaine de caractères

Posté par  .
Étiquettes : aucune
0
20
mai
2006
Bonjour,

je manipule des chaines de caractères - de la forme
"APPEND nom" ou "01 ELEMENT" - en les découpant suivant le résultat de test. Mais j'ai un problème sur les tests. En effet le shell étant non-typés il y a quelques surprises avec les chaines.

[code]
chaine=`expr substr "${ligne}" 1 6`
if [ "$chainelu" = "APPEND" ]
[/code]
donc chaine contient APPEND ou 01 ELE mais le test ne fait rien!!
Soit que c'est toujours vrai suivant l'ajout de "" ("`expr substr "${ligne}" 1 6`") soit il plante - erreur de syntaxe- du fait à priori qu'il considère que la chaine "01 ELE" c'est 01 puis ELE...
J'avais le m^mee problème avec ligne mais cela c'est réglé avec des guillemets sauf que la j'ai essayé les guillements, quote, backquote. mais rien ne fonctionne.
Que puis je faire ?
J'ai pensé faire chaine=`expr substr "${ligne}" 1 2` ainsi le test s'effecturait sur AP mais cela ne me plait pas et je trouve cela du bricolage(je pense qu'on peut faire mieux!!) sans aucune garantie pour la suite de ne pas avoir (AP ELEMENT par exemple).


J'ai aussi voulu passé par un case mais la il ne fait rien du tout ce n'est jamais égale!!
[code]
case "$chaine" in
"APPEND")
echo "---------append--------------" ;;
"END")
echo "-------------END--------------"
*) echo "lignes"
esac
[/code]

Merci pour toutes suggestions ou remarque sur les chaines de caractères en shell(J'ai charché des infos sur le net mais tous ce ressemble et n'apportent pas d''exemple concluant).
C
  • # faute de frappe ?

    Posté par  (site web personnel) . Évalué à 1.

    dans le premier cas, tu assignes une valeur à $chaine, mais tu testes $chainelu alors que dans le second, il manque quelques points-virgules.

    Chez moi le code suivant fonctionne (sous bash) :
    #!/bin/sh
    read ligne
    chaine=`expr substr "${ligne}" 1 6`
    case "$chaine" in
    "APPEND")
    echo "---------append--------------" ;;
    "01 ELE")
    echo "---------01 ele--------------" ;;
    "END")
    echo "-------------end--------------" ;;
    *)
    echo "$ligne";;
    esac
    • [^] # Re: faute de frappe ?

      Posté par  . Évalué à 1.

      Oui c'est une faute de frappe.
      En fait j'ai commencé par le case mais comme il ne fonctionnait pas j'ai tenté le if... C'est la même chose en théorie mais bon ?!
      En tout cas chez moi cela ne marche pas. Il ne passe jamais dans les cas particuliers seulement dans le cas général,
      ou suivant - où je mets des guillemets - que dans le cas APPEND ET END et m'indiquant une erreur pour pour les cas ou ligne contient 01 ele...
  • # As tu essayer les tableaux ?

    Posté par  (site web personnel) . Évalué à 1.

    A tu essayé les tableaux ?
    ex:


    while read ligne; do
    # converti en tableau une chaine séparé par des espaces;
    ligne=($ligne)

    # test si la 1ere chaine vaut APPEND
    # ps: le x est la pour le cas ou la variable ne contient
    # pas de données.
    if [ x${TOTO[0]} = "xAPPEND" ]; then
    ...
    else
    ...
    fi
    done

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.