Il convient de mentionner que la plage spécifiée ici est inclusive . Par cela, je veux dire que vous verrez toute la plage (1 à 10) imprimée sur la console.
si nous avons une variable comme ArrayLength=${#array[@]}comment l'utiliser ici au lieu de max?
Kasun Siyambalapitiya
34
Le bash forconsiste en une variable (l'itérateur) et une liste de mots où l'itérateur va, eh bien, itérer.
Donc, si vous avez une liste limitée de mots, mettez-les simplement dans la syntaxe suivante:
for w in word1 word2 word3do
doSomething($w)done
Vous souhaitez probablement parcourir certains nombres, vous pouvez donc utiliser la seqcommande pour générer une liste de nombres pour vous: (de 1 à 100 par exemple)
seq 1100
et utilisez-le dans la boucle FOR:
for n in $(seq 1100)do
doSomething($n)done
Notez la $(...)syntaxe. C'est un comportement bash, il vous permet de passer la sortie d'une commande (dans notre cas de seq) à une autre (le for)
Ceci est vraiment utile lorsque vous devez parcourir tous les répertoires dans un chemin, par exemple:
for d in $(find $somepath -type d)do
doSomething($d)done
Les possibilités sont infinies pour générer les listes.
Bonne réponse, mais vous voudrez peut-être inclure le for ((i = 0; i <MAX; i ++)); faire quelque chose ($ i); fait une variante aussi. Je pense que cela est généralement préféré à la variante for i in $ (seq 0 MAX) car cette dernière générera d'abord tous les nombres de 0 à MAX avant d'exécuter réellement la boucle.
mweerden
30
Bash 3.0+ peut utiliser cette syntaxe:
for i in{1..10};do...;done
..qui évite de générer un programme externe pour étendre la séquence (comme seq 1 10).
Bien sûr, cela pose le même problème que la for(())solution, étant lié à bash et même à une version particulière (si cela vous intéresse).
$ help forfor:for NAME [in WORDS ...;]do COMMANDS;doneThe`for' loop executes a sequence of commands for each member in a
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
assumed.For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.for((:for(( exp1; exp2; exp3 ));do COMMANDS;doneEquivalent to(( EXP1 ))while(( EXP2 ));do
COMMANDS(( EXP3 ))done
EXP1, EXP2, and EXP3 are arithmetic expressions.If any expression is
omitted, it behaves as if it evaluates to 1.
Je ne l'ai pas remarqué auparavant, mais une syntaxe similaire est présentée dans l'une des réponses précédentes. La seule chose ici est l'utilisation d'accolades au lieu de la paire do/ typique done.
Brent Bradburn
4
J'aime généralement utiliser une légère variante de la boucle for standard. J'utilise souvent ceci pour exécuter une commande sur une série d'hôtes distants. Je profite de l'expansion des accolades de bash pour créer des boucles for qui me permettent de créer des boucles for non numériques.
Exemple:
Je veux exécuter la commande uptime sur les hôtes frontaux 1-5 et les hôtes backend 1-3:
%for host in{frontend{1..5},backend{1..3}}.mycompany.com
do ssh $host "echo -n $host; uptime"done
Je l'exécute généralement comme une commande sur une seule ligne avec des points-virgules aux extrémités des lignes au lieu de la version plus lisible ci-dessus. La considération clé pour l'utilisation est que les accolades vous permettent de spécifier plusieurs valeurs à insérer dans une chaîne (par exemple, pre {foo, bar} post résultats dans prefoopost, prebarpost) et permettent le comptage / séquences en utilisant les doubles points (vous pouvez utiliser un. .z etc.). Cependant, la syntaxe à double période est une nouvelle fonctionnalité de bash 3.0; les versions antérieures ne prendront pas en charge cela.
À ce propos, que se passe-t-il si $ host var est une ligne vide par accident? Il déclencherait toujours ssh. Alors, comment éviter cela? Dans mon cas, je fais quelque chose de différent et donc votre réponse m'aidera. J'essaie de vérifier Gmail pour de nouveaux messages et, si trouvé, d'envoyer un SMS de et d'objet. Ma question est intitulée "Connexion de deux commandes Bash" si vous voulez la lire.
Volomike
Je ne pense pas que vous obtiendriez une variable $ host vide. C'est parce que l'exemple ci-dessus utilise l'expansion d'accolades. La boucle for définit explicitement la variable $ host sur les valeurs: frontend1.mycompany.com frontend2.mycompany.com. . backend1.mycompany.com Mais si vous voyez un moyen pour qu'il ait une valeur nulle; Je serais intéressé de savoir. Vous pouvez exécuter le ssh dans un test conditionnel si c'était un problème.
terson
1
si vous n'êtes intéressé que par bash, la solution "for ((...))" présentée ci-dessus est la meilleure, mais si vous voulez quelque chose de compatible POSIX SH qui fonctionnera sur tous les unices, vous devrez utiliser "expr" et "while", et c'est parce que "(())" ou "seq" ou "i = i + 1" ne sont pas si portables parmi divers shells
Réponses:
Depuis ce site :
la source
la source
ArrayLength=${#array[@]}
comment l'utiliser ici au lieu demax
?Le bash
for
consiste en une variable (l'itérateur) et une liste de mots où l'itérateur va, eh bien, itérer.Donc, si vous avez une liste limitée de mots, mettez-les simplement dans la syntaxe suivante:
Vous souhaitez probablement parcourir certains nombres, vous pouvez donc utiliser la
seq
commande pour générer une liste de nombres pour vous: (de 1 à 100 par exemple)et utilisez-le dans la boucle FOR:
Notez la
$(...)
syntaxe. C'est un comportement bash, il vous permet de passer la sortie d'une commande (dans notre cas deseq
) à une autre (lefor
)Ceci est vraiment utile lorsque vous devez parcourir tous les répertoires dans un chemin, par exemple:
Les possibilités sont infinies pour générer les listes.
la source
Bash 3.0+ peut utiliser cette syntaxe:
..qui évite de générer un programme externe pour étendre la séquence (comme
seq 1 10
).Bien sûr, cela pose le même problème que la
for(())
solution, étant lié à bash et même à une version particulière (si cela vous intéresse).la source
Essayez l'
bash
aide intégrée:la source
Voici un exemple qui peut également fonctionner dans des shells plus anciens, tout en restant efficace pour les grands comptes:
Mais bonne chance pour faire des choses utiles à l'intérieur de
awk
: Comment utiliser des variables shell dans un script awk?la source
do
/ typiquedone
.J'aime généralement utiliser une légère variante de la boucle for standard. J'utilise souvent ceci pour exécuter une commande sur une série d'hôtes distants. Je profite de l'expansion des accolades de bash pour créer des boucles for qui me permettent de créer des boucles for non numériques.
Exemple:
Je veux exécuter la commande uptime sur les hôtes frontaux 1-5 et les hôtes backend 1-3:
Je l'exécute généralement comme une commande sur une seule ligne avec des points-virgules aux extrémités des lignes au lieu de la version plus lisible ci-dessus. La considération clé pour l'utilisation est que les accolades vous permettent de spécifier plusieurs valeurs à insérer dans une chaîne (par exemple, pre {foo, bar} post résultats dans prefoopost, prebarpost) et permettent le comptage / séquences en utilisant les doubles points (vous pouvez utiliser un. .z etc.). Cependant, la syntaxe à double période est une nouvelle fonctionnalité de bash 3.0; les versions antérieures ne prendront pas en charge cela.
la source
si vous n'êtes intéressé que par bash, la solution "for ((...))" présentée ci-dessus est la meilleure, mais si vous voulez quelque chose de compatible POSIX SH qui fonctionnera sur tous les unices, vous devrez utiliser "expr" et "while", et c'est parce que "(())" ou "seq" ou "i = i + 1" ne sont pas si portables parmi divers shells
la source
J'utilise constamment des variantes pour traiter les fichiers ...
Si le traitement des listes de fichiers vous intéresse, regardez l' option -execdir pour les fichiers .
la source