Boucler sur les annuaires en Bash

J'ai une question fondamentale sur la façon bash fonctionne, et une question d'ordre pratique.

Question fondamentale: supposons que je suis dans un répertoire qui comporte trois sous-répertoires: a, b, et c.

poule le code

for dir in $(ls)
do 
    echo $dir
done

crache:

a b c
a b c
a b c

je.e, dir toujours stocke une liste de tous les fichiers/répertoires dans mon cwd. Ma question est: pourquoi dans le monde serait-ce pratique? À mon avis, il est beaucoup plus utile et intuitif pour avoir dir stocker chaque élément à la fois, j'.e je ne veux pas avoir de sortie

a
b
c

Aussi, comme l'une des réponses - c'est mal d'utiliser for dir in $(ls), mais lorsque j'utilise for dir in $(ls -l) - je obtenir encore plus de copies de a b c (plus qu'il existe des répertoires/fichiers dans le cwd). Pourquoi est-ce?

Ma deuxième question pratique: comment faire une boucle sur tous les répertoires (pas les fichiers!) dans mon cwd que de commencer avec un capital W? J'ai commencé avec

for dir in `ls -l W*`

mais cela échoue, car a) la raison dans la question 1 et b) parce qu'il n'a pas d'exclure des fichiers. Suggestions apprécié.

Votre extrait de code ne donne pas le résultat que vous dire qu'il fait. Veuillez reproduire le code réel avec plus de soin.
Vous êtes de droite. Quand j'ai essayer ce code j'ai été en utilisant $(ls), mais quand j'ai écrit la question, j'ai changé $(ls) à $(ls -l) parce que cela semble être la façon dont c'est fait, partout où j'ai regardé. Je suppose que le résultat serait le même et je suis surpris qu'il ne l'est pas.
Pourquoi êtes-vous surpris d'apprendre que la sortie de ls -l est différent par rapport à juste ls? Le paramètre change son comportement (type man ls pour plus de détails): -l vous donne longue sortie, y compris les autorisations, la propriété, la date, etc. C'est un encore plus grand non-non à l'analyse, parce que sa production peut varier considérablement en fonction de la mise en œuvre et de votre locale. ls -l est ce que vous pouvez utiliser sur la ligne de commande, mais jamais dans un script comme celui-ci. Si vous avez vu le code qui analyse sa sortie dans votre environnement, vous devez contacter l'auteur et de demander qu'ils soient corrigés.
Bon, je veux dire que je suis surpris de voir que le format de la sortie est si différent. La sortie de la $(ls) cas donne trois rangées de a b c, alors que la sortie de $(ls -l) les rendements de trois lignes, chacune contenant la sortie désirée (a, suivie par b, suivie par c). J'ai compris que les commandes sont ... similaire? ... devrait donc produire raisonnablement ... similaire? ... de sortie.
Double Possible de stackoverflow.com/questions/2107945/...

OriginalL'auteur alexvas | 2013-04-06