207 votes

script shell "pour" syntaxe de boucle

J'ai le travail suivant:

pour i dans {2..10}
faire
    echo "sortie: $ i"
terminé

Il produit une série de lignes de output: 2 , output: 3 , etc.

Cependant, essayez d’exécuter ce qui suit:

max = 10
pour i dans {2 .. $ max}
faire
    echo "$ i"
terminé

produit ce qui suit:

 sortie: {2..10} 

Comment puis-je obtenir que le compilateur réalise qu'il doit traiter $ max comme l'autre extrémité du tableau et non comme une chaîne?

252voto

whatsisname Points 2628

le développement d'accolade, {x..y} est effectué avant les autres développements, vous ne pouvez donc pas l'utiliser pour des séquences de longueur variable.

Au lieu de cela, utilisez la méthode seq 2 $max comme indiqué par mobrule.

Donc, pour votre exemple, ce serait:

 max=10
for i in `seq 2 $max`
do
    echo "$i"
done
 

75voto

system PAUSE Points 10051

Essayez la version à expression arithmétique de for :

 max=10
for ((i=2; i<=$max; ++i )) ; 
do
    echo "$i"
done
 

Ceci est disponible dans la plupart des versions de bash, et devrait également être compatible avec Bourne shell (sh).

30voto

Nietzche-jou Points 7711

Montez la boucle manuellement:

i = 0
max = 10
tandis que [$ i -lt $ max]
faire
    echo "sortie: $ i"
    true $ ((i ++))
terminé

Si vous n'avez pas besoin d'être totalement POSIX, vous pouvez utiliser l'arithmétique pour la boucle:

max = 10
pour ((i = 0; i <max; i ++)); echo "sortie: $ i"; terminé

Ou utilisez jot (1) sur les systèmes BSD:

pour i in $ (jot 0 10); echo "sortie: $ i"; terminé

9voto

mob Points 61524

La commande seq disponible sur votre système?

 for i in `seq 2 $max`
do
  echo "output: $i"
done
 

EDIT: Non seq ? Alors que diriez-vous d'un homme pauvre seq avec perl ?

 seq=`perl -e "\$,=' ';print 2..$max"`
for i in seq
do
  echo "output: $i"
done
 

Regardez ces guillemets.

9voto

ephemient Points 87003

Il y a plus d'une façon de le faire.

 max=10
for i in `eval "echo {2..$max}"`
do
    echo "$i"
done
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X