Forum Programmation.shell Espace dans un enregistrement..

Posté par  .
Étiquettes : aucune
0
1
mai
2006
Bonjour à tous.

Je débute en bash et là je me retrouve devant un problème qui me rend fou.
Je suis sur que c'est très simple et que vous allez me sortir de là très rapidement.

Dans une variable j'ai plusieurs champs dont certains avec des espaces:
ici: echo "Ma var: $TOTO"
rend:"
Ma var: valeur1
valeur2
ma valeur numero 3

Quand je fais
for toto in $TOTO do
echo "trouve: $toto"
done;

il me rend:
trouve:valeur1
trouve:valeur2
trouve:ma
trouve:valeur
trouve:numero
trouve:3

Je voudrais trouver:
trouve:valeur1
trouve:valeur2
trouve:ma valeur numero 3

Comment faire?
Merci d'avance.
Thomas

NB:
Pour info ma variable $TOTO a été construit de cette manière:

$TOTO=`smbclient -N -L "$NETWORK$CURRENT" 2>&1 | grep Disk | sed -e "s/^[\t]*//g" | grep -v [$] | awk -F" " {'print $1_$2_$3 '} `
  • # Réponse partielle : IFS

    Posté par  . Évalué à 3.

    Je pense que tu devrais regarder du côté de la variable interne bash IFS qui dit quel caractère utiliser pour la séparation des mots.
    Par défaut c'est l'espace, mais si tu fais un export IFS='\n', les espaces ne devraient plus être considérés comme séparant des mots et tu ne devrais plus avoir ton problème...
  • # séparateur ?

    Posté par  . Évalué à 3.

    Peut être peux-tu fixer la variable IFS à la seule valeur <retour chariot> ?
    Je suis très nul pour ces trucs, mais il m'est arrivé d'utiliser :
    IFS=$(echo -e "\n")
    (hum !)

    (A ce propos, si quelqu'un pouvait expliquer comment affecter ce genre de chaine de caractères plus simplement, je suis preneur)
  • # réponse groupée

    Posté par  . Évalué à 5.

    si tu fais un export IFS='\n'
    presque
    (A ce propos, si quelqu'un pouvait expliquer comment affecter ce genre de chaine de caractères plus simplement, je suis preneur)

    IFS=$'\n'

    $TOTO=`smbclient -N -L "$NETWORK$CURRENT" 2>&1 | grep Disk |
    sed -e "s/^[\t]*//g" | grep -v [$] | awk -F" " {'print $1_$2_$3 '}
    glurps !! D'ailleurs, y aurait pas une erreur dans la commande awk ? (Et le 3è champ peut contenir des espaces...)
    TOTO="`smbclient -N -L "$NETWORK$CURRENT" 2>/dev/null |
    sed -n '/\$/!s/^\t*\([^ ]*\) *\(Disk\) *\(.*\)/\1_\2_\3/p'`"
    • [^] # Re: réponse groupée

      Posté par  . Évalué à 1.


      >>si tu fais un export IFS='\n'
      >presque

      >>(A ce propos, si quelqu'un pouvait expliquer comment
      >>affecter ce genre de chaine de caractères plus
      >>simplement, je suis preneur)
      >IFS=$'\n'

      Merci pour cette précision. Je n'était en effet plus très sûr de export IFS='\n'. Par contre, pourrais-tu expliquer pourquoi il faut mettre un dollar avant '\n' ? J'avoue que ce n'est pas très clair pour moi...
    • [^] # Re: réponse groupée

      Posté par  . Évalué à 2.

      Au passage, ce lien qui donnait déjà la réponse dans les forums linuxfr :
      http://linuxfr.org/forums/31/7630.html

Suivre le flux des commentaires

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