Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lire une chaîne ligne à ligne

4 réponses
Avatar
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="\n" read i
do
echo -e "${i}\n---"
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/

4 réponses

Avatar
Nicolas George
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.
Avatar
Ph. Ivaldi
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/
Avatar
Nicolas George
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.
Avatar
Ph. Ivaldi
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/