Lire une chaîne ligne à ligne

Le
Ph. Ivaldi
Bonjour,

Le doute m'habite
8<8<8<8<8<8<8<8<8<
toto='1 A
2
3
4'

echo "$toto" | while IFS="" read i
do
echo -e "${i}"
done
8<8<8<8<8<8<8<8<8<

1. Ça marche mais est-ce une façon correcte, portable et minimale de
lire une chaîne ligne à ligne ?
2. Quelle explication donneriez-vous sur le fait quand mettant
echo $toto à la place de echo "$toto" cela ne donne pas le résultat
escompté.

Merci,
--
Philippe Ivaldi.
http://www.piprime.fr/
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Nicolas George
Le #20350771
Ph. Ivaldi wrote in message
1. Ça marche mais est-ce une façon correcte, portable et minimale de
lire une chaîne ligne à ligne ?



Non, puisque ça table sur le comportement de la commande echo, qui est loin
d'être fiable.

2. Quelle explication donneriez-vous sur le fait quand mettant
echo $toto à la place de echo "$toto" cela ne donne pas le résultat
escompté.



Sans les guillemets, $toto est redécoupé sur les blancs et passé à echo en
plusieurs arguments ; echo affiche les différents arguments séparés à chaque
fois par un caractère espace.
Ph. Ivaldi
Le #20351391
Le 14 octobre 2009, Nicolas George écrivit :

Ph. Ivaldi wrote in message
1. Ça marche mais est-ce une façon correcte, portable et minimale de
lire une chaîne ligne à ligne ?


Non, puisque ça table sur le comportement de la commande echo, qui est loin
d'être fiable.



printf alors ?

2. Quelle explication donneriez-vous sur le fait quand mettant
echo $toto à la place de echo "$toto" cela ne donne pas le résultat
escompté.


Sans les guillemets, $toto est redécoupé sur les blancs et passé à echo en
plusieurs arguments ; echo affiche les différents arguments séparés à chaque
fois par un caractère espace.



Apparemment il redécoupe aussi sur le retour à la ligne, sinon on
devrait avoir un « 2: command not found ». Il y a un truc qui
m'échappe...

Je pose cette question car j'ai rencontré ce problème
8<------8<------8<------8<------8<------8<------8<------8<------8<------
toto='1
2
3
4'

echo "$toto" | tr "n" "@"

echo

foo="$(echo "$toto" | tr "\n" "@")"
echo $foo
8<------8<------8<------8<------8<------8<------8<------8<------8<------
donne
@@
"1 2 3 4"@

alors que je m'attendais à deux fois @@...

Je viens seulement maintenant de découvrir que c'est dû à l'interpréteur
$() qui n'est pas équivalent à ``
foo="`echo "$toto" | tr "\n" "@"`"
donne bien @@

Il me semble pourtant avoir lu qu'il valait mieux maintenant utiliser
$().
Quelles différences y-a-t-il exactement entre $() et `` ?
--
Philippe Ivaldi.
http://www.piprime.fr/
Nicolas George
Le #20351721
Ph. Ivaldi wrote in message
Apparemment il redécoupe aussi sur le retour à la ligne



Le retour à la ligne est un blanc.

Quelles différences y-a-t-il exactement entre $() et `` ?



Avec $(), c'est moins le cauchemar pour l'échappement.
Ph. Ivaldi
Le #20351761
Le 14 octobre 2009, Nicolas George écrivit :

Ph. Ivaldi wrote in message
Apparemment il redécoupe aussi sur le retour à la ligne


Le retour à la ligne est un blanc.



Ok, il découpe suivant la valeur de IFS dont la valeur par défaut
est ``<space><tab><newline>''

Merci,
--
Philippe Ivaldi.
http://www.piprime.fr/
Publicité
Poster une réponse
Anonyme