À l'aide d'une variable dans le corset de l'expansion de la gamme de la fed à une boucle for
Est ici myscript.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}
au lieu de
3 1
3 2
3 3
Clairement $3
contient la bonne valeur, alors pourquoi ne pas for i in {1..$1}
se comportent de la même manière que si j'avais écrit for i in {1..3}
directement?
- Votre exemple de script fonctionnent dans les deux ksh93 et zsh.
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser un style C pour la boucle pour ce faire:
Cela évite des commandes externes et méchant eval consolidés.
test.sh: line 1: ((: i<=: syntax error: operand expected (error token is "<=")
bash
? Est votre shebang#!/bin/bash
ou#!/bin/sh
?bash test.sh
bash test.sh 12
. Le$1
est une position arg.Car accolade de l'expansion se produit avant l'expansion de variables. http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion.
Si vous souhaitez utiliser des accolades, vous pouvez donc quelque chose de sombre comme ceci:
Résumé: Bash est vil.
eval
. Re: vile:bash
n'est pas horrible, mais c'est un peu comme boire de l'alcool de grain de droite. Certaines personnes semblent comme elle, mais il est difficile de ne pas s'étouffer en première et en plus vous le faites, moins vous êtes gêné par elle.Vous pouvez utiliser
seq
commande:Ou vous pouvez utiliser le C-style
for...loop
:Ici est une façon d'élargir les variables à l'intérieur d'accolades sans eval:
Nous avons maintenant un beau tableau de nombres:
Je sais que vous avez mentionné bash dans le titre, mais je voudrais ajouter que " pour i dans {$1..$2}' fonctionne comme prévu dans zsh. Si votre système a zsh installé, vous pouvez simplement changer votre arborescence de zsh.
À l'aide de zsh avec l'exemple " pour i dans {$1..$2}' a aussi l'avantage que $1 peut être de moins de 2 $et il fonctionne toujours, quelque chose qui nécessite un peu de vous embêter si vous voulais que ce type de flexibilité avec un style C pour la boucle.