Forum Programmation.shell For i in ...

Posté par  .
Étiquettes : aucune
0
12
oct.
2007
Bonjour à tous,

Juste pour ma culture personnelle, à l'image de la correspondance entre

for i in `cat toto` et for i in $(<toto)

y a t-il une autre façon de faire un

for i in `cat`?

Ma recherche sur le net n'a pas été fructueuse...
Merci d'avance !
  • # Y'en a autant que tu veux....

    Posté par  . Évalué à 3.

    Rien ne t'empêche d'appeler n'importe quel programme, que ce soit un shell ou un binaire tant que celui-ci prend un nom de fichier en paramètre, et envoie le résultat sur la sortie standard....
    Ainsi, si ton fichier toto fait n lignes, tu peux toujours remplacer ton cat par au choix :
    tail -n toto
    head -n toto
    si tu ne connais pas le nombre de lignes, pourquoi ne pas faire aussi bien :
    for i in `sed "s/.*/&/" toto`
    Bref, tu as autant de possibilités que tu veux...
    Si tu veux t'amuser, tu peux même utiliser des fifo, des pipes, etc...
    Bref, tu es libre de choisir ce qui te plais vraiment...
    • [^] # Re: Y'en a autant que tu veux....

      Posté par  . Évalué à 1.

      Désolé je pensais avoir été clair avec mon exemple du dessus.

      Je voulais simplement éviter l'usage des ` ` qui font créer un nouveau shell et lancer cat (ou autre).

      Avec for i in $(<toto), si je ne m'abuse, tout se fait dans le shell courant.
      • [^] # Re: Y'en a autant que tu veux....

        Posté par  . Évalué à 1.

        En effet, j'avais mal compris la question....
        Dans ce cas, rien ne t'empêche de faire :
        for i in $(cat toto)
        ça revient presque au même...
  • # hmm

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

    while read i
    do
    done < toto

    Mais c'était ptet pas ca la question ;)
    • [^] # Re: hmm

      Posté par  . Évalué à 2.

      Si, ça me plait bien, même si c'est pas avec un for :)
      • [^] # Re: hmm

        Posté par  . Évalué à 1.

        Mais ça ne donne pas le même résultat.
        Le "while read" va te lire l'entrée standard ligne par ligne, alors que ton "for in cat" lit mot pas mot (au sens du shell).
        Pour avoir le même résultat il faut combiner un while et un for:

        while read line;do
        for i in line;do
        #stuff
        done
        done < toto
  • # Ben...

    Posté par  . Évalué à 1.

    for i in $(</dev/stdin)
    ... mais ta boucle ne commencera que quand t'auras envoyé un EOF (Ctrl-D).

Suivre le flux des commentaires

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