47 votes

Utilisation d'une variable dans la plage d'extension d'accolades transmise à une boucle for

Voici monscript.sh

 #!/bin/bash
for i in {1..$1};
do
    echo $1 $i;
done

Si je lance myscript.sh 3 la sortie est

 3 {1..3}

à la place de

 3 1
3 2
3 3

Il est clair que $3 contient la bonne valeur, alors pourquoi for i in {1..$1} se comporte-t-il pas de la même manière que si j'avais écrit directement for i in {1..3}

69voto

jordanm Points 6490

Vous devez utiliser une boucle for de style C pour accomplir ceci :

 for ((i=1; i<=$1; i++)); do
   echo $i
done

Cela évite les commandes externes et les déclarations eval désagréables.

27voto

Oli Charlesworth Points 148744

Parce que l'expansion des accolades se produit avant l'expansion des variables. http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion .

Si vous voulez utiliser des accolades, vous pouvez faire quelque chose de sinistre comme ceci :

 for i in `eval echo {1..$1}`;
do
    echo $1 $i;
done

Résumé : Bash est vil.

15voto

kev Points 41855

Vous pouvez utiliser la commande seq :

 for i in `seq 1 $1`

Ou vous pouvez utiliser le style C for...loop :

 for((i=1;i<=$1;i++))

2voto

Jonathan Cross Points 158

Voici un moyen de développer des variables entre accolades sans eval :

 end=3
declare -a 'range=({'"1..$end"'})'

Nous avons maintenant un joli tableau de nombres :

 for i in ${range[@]};do echo $i;done
1
2
3

1voto

Joshua Points 1

Je sais que vous avez mentionné bash dans le titre, mais j'ajouterais que 'for i in {$1..$2}' fonctionne comme prévu dans zsh. Si votre système a installé zsh, vous pouvez simplement changer votre shebang en zsh.

L'utilisation de zsh avec l'exemple 'for i in {$1..$2}' présente également l'avantage supplémentaire que 1 $ peut être inférieur à 2 $ et que cela fonctionne toujours, ce qui nécessiterait pas mal de déconner si vous vouliez ce genre de flexibilité avec une boucle for de style C.

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