2016-05-17 1 views
2

Disons que j'ai une boucle en bash qui ressemble à ceci:L'ordre d'itération dans bash pour la boucle est-il garanti?

for i in $MYDIR/*.jar 
do 
    # do something with files 
done 

est l'ordre d'itération garantie, à savoir la boucle sera toujours traiter les fichiers en même ordre? Si c'est garanti, l'ordre est-il alphabétique?

+3

Je crois que cela s'applique: http://serverfault.com/a/122743/1239 –

+1

BTW, ce n'est pas une question sur les boucles en général, c'est une question sur globs. 'pour moi en 9 5 3; fais écho "$ i"; fait »fonctionnerait dans cet ordre. –

+2

Vous posez la mauvaise question. Ce n'est pas la boucle qui étend votre *. Le shell va d'abord développer votre * .jar dans une liste de fichiers, puis la boucle parcourra cette liste de fichiers. – hymie

Répondre

1

Selon le bash man page:

Pathname Expansion

Après la séparation de mots, à moins que l'option -f a été défini, scans bash chaque mot pour les caractères *, et [?. Si l'un de ces caractères apparaît, alors le mot est considéré comme un motif et remplacé par une liste triée par ordre alphabétique des noms de fichiers correspondant au motif (voir Motif correspondant ci-dessous).

Ainsi, les fichiers seront traités dans l'ordre alphabétique (qui dépend de vos paramètres régionaux, voir les commentaires) en raison des règles d'expansion jokers.

+2

Uniquement l'ordre ASCII si votre locale est C. "trié par ordre alphabétique" ne signifie pas universellement ASCII. –

+0

... par exemple, certaines locales ont un ordre de collation de AaBbCc ... et pour d'autres c'est ABC ... abc ... –

+0

@CharlesDuffy merci, j'ai édité ma réponse –