J'ai le travail suivant:
for i in {2..10}
do
echo "output: $i"
done
Il produit un tas de lignes de output: 2
, output: 3
, etc.
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 faire en sorte que le compilateur réalise qu'il doit traiter $ max comme l'autre extrémité du tableau et non comme une chaîne?
Le développement d'accolade, {x..y} est effectué avant les autres extensions, 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 tilisateur mob déclaré .
Donc, pour votre exemple, ce serait:
max=10
for i in `seq 2 $max`
do
echo "$i"
done
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).
Montez la boucle manuellement:
i = 0 max = 10 tandis que [$ i -lt $ max] font écho "sortie: $ i" true $ ((i ++)) terminé
Si vous ne devez pas être totalement POSIX, vous pouvez utiliser la boucle arithmétique pour:
max = 10 pour ((i = 0; i <max; i ++)); echo "output: $ i"; terminé
Ou utilisez note (1) sur les systèmes BSD:
pour i en $ (jot 0 10); echo "output: $ i"; terminé
Si la commande seq
disponible sur votre système:
for i in `seq 2 $max`
do
echo "output: $i"
done
Sinon, utilisez le seq
du pauvre homme avec Perl
:
seq=`Perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
echo "output: $i"
done
Regardez ces guillemets.
Il y a plus d'une façon de le faire.
max=10
for i in `eval "echo {2..$max}"`
do
echo "$i"
done
C'est un moyen:
Frapper:
max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done
La méthode Bash ci-dessus fonctionnera également pour ksh
et zsh
, lorsque bash -c
sera remplacé par ksh -c
ou zsh -c
, respectivement.
Remarque: for i in {2..${max}}; do echo $i; done
fonctionne dans zsh
et ksh
.
On peut itérer en boucle comme en C.
#!/bin/bash
for ((i=1; i<=20; i=i+1))
do
echo $i
done
Ici, cela fonctionnait sous Mac OS X.
Il inclut l'exemple d'une date BSD, comment incrémenter et décrémenter la date également:
for ((i=28; i>=6 ; i--));
do
dat=`date -v-${i}d -j "+%Y%m%d"`
echo $dat
done
Comme je n'avais pas installé la commande seq
sur mon système (Mac OS X v10.6.1 (Snow Leopard)), j'ai fini par utiliser une boucle while
:
max=5
i=1
while [ $max -gt $i ]
do
(stuff)
done
* hausse des épaules * Tout ce qui fonctionne.
Celles-ci font toutes {1..8}
et devraient toutes être POSIX. Ils ne seront pas non plus cassés si vous mettez un continue
conditionnel dans la boucle. La manière canonique:
f=
while [ $((f+=1)) -le 8 ]
do
echo $f
done
Autrement:
g=
while
g=${g}1
[ ${#g} -le 8 ]
do
echo ${#g}
done
et un autre:
set --
while
set $* .
[ ${#} -le 8 ]
do
echo ${#}
done
Utilisation:
max=10
for i in `eval echo {2..$max}`
do
echo $i
done
Vous avez besoin de l'appel explicite 'eval' pour réévaluer le {} après la substitution de variable.