J'ai fait fonctionner les éléments suivants:
for i in {2..10}
do
echo "output: $i"
done
Elle produit un tas de lignes output: 2
, output: 3
, ainsi de suite.
Cependant, essayez d'exécuter ce qui suit:
max=10
for i in {2..$max}
do
echo "$i"
done
produit ce qui suit:
output: {2..10}
Comment puis-je faire en sorte que le compilateur réalise qu'il doit traiter $ max comme l'autre extrémité du tableau, et non comme faisant partie d'une chaîne?
echo "$i
devrait êtreecho "$i"
- ne résoudra pas le problème, cependant.do
-then
clés et sur la même ligne quefor
etif
, respectivement. Par exemple,for i in {2..10}; do
Réponses:
L'expansion d' accolades , {x..y} est effectuée avant les autres expansions, vous ne pouvez donc pas l'utiliser pour des séquences de longueur variable.
Utilisez plutôt la
seq 2 $max
méthode indiquée par l' utilisateur mob .Donc, pour votre exemple, ce serait:
la source
seq
compter et incrémenter des nombres dans la boucle for, il est donc recommandé d'éviter d'utiliserseq
. Cette commande est laissée pour compatibilité avec l'ancien bash. Les commandes intégrées sont assez rapides.for (( EXP1; EXP2; EXP3 )) ...
for (( ... ))
syntaxe n'est pas POSIX et cela signifie par exemple que cela ne fonctionnera pas directement sur des choses comme Alpine Linux.seq
Est-ce que.#!/bin/sh
est Dash dans Debian / Ubuntu.Essayez la version d'expression arithmétique de
for
:Ceci est disponible dans la plupart des versions de bash et devrait également être compatible avec Bourne shell (sh).
la source
sh
, ce qui en fait un lien vers un autre shell. Idéalement, un shell invoqué nesh
prendrait en charge que ces fonctionnalités dans le standard POSIX, mais laisserait par défaut certaines de leurs fonctionnalités supplémentaires passer. La boucle for de style C n'est pas une fonctionnalité POSIX, mais peut être en mode par le shell réel.sh
Étape de la boucle manuellement:
Si vous ne devez pas être totalement POSIX, vous pouvez utiliser l'arithmétique pour la boucle:
Ou utilisez jot (1) sur les systèmes BSD:
la source
true $(( i++ ))
ne fonctionne pas dans tous les cas, donc la plupart des portables le seraienttrue $((i=i+1))
.Il y a plus d'une façon de le faire.
la source
eval
évaluera tout ce que vous définissezmax
. Considérezmax="2}; echo ha; #"
, puis remplacezecho ha
par quelque chose de plus destructeur.Si la
seq
commande disponible sur votre système:Sinon, utilisez le pauvre homme
seq
avecperl
:Regardez ces guillemets.
la source
C'est un moyen:
Bash:
La méthode Bash ci-dessus fonctionnera pour
ksh
etzsh
aussi, quandbash -c
est remplacé parksh -c
ouzsh -c
respectivement.Remarque:
for i in {2..${max}}; do echo $i; done
fonctionne danszsh
etksh
.la source
Nous pouvons itérer une boucle comme la programmation en C.
la source
Ici, cela a fonctionné sur Mac OS X.
Il comprend l'exemple d'une date BSD, comment incrémenter et décrémenter la date également:
la source
Eh bien, comme je n'avais pas la
seq
commande installée sur mon système (Mac OS X v10.6.1 (Snow Leopard)), j'ai fini par utiliser unewhile
boucle à la place:* Shrugs * Tout ce qui fonctionne.
la source
Tout cela fait
{1..8}
et devrait être POSIX. Ils ne casseront pas non plus si vous mettez un conditionnelcontinue
dans la boucle. La voie canonique:Autrement:
et un autre:
la source
Utilisation:
Vous avez besoin de l'appel explicite 'eval' pour réévaluer {} après la substitution de variable.
la source