discussion
À l'aide de seq
est très bien, que Jiaaro suggéré. Pax Diablo suggéré une boucle en bash pour éviter d'appeler un sous-processus, avec l'avantage supplémentaire d'être plus de mémoire sympathique si $FIN est trop grand. Zathrus repéré typique d'un bug dans la boucle de la mise en œuvre, et a également laissé entendre que depuis que j'ai est une variable de texte, continue de conversions-et-vient numéros sont effectuées avec un associé ralentissement.
l'arithmétique des nombres entiers
C'est une version améliorée de la boucle en bash:
typeset -i i END
let END=5 i=1
while ((i<=END)); do
echo $i
…
let i++
done
Si la seule chose que nous voulons, c'est l' echo
, alors nous pourrions écrire echo $((i++))
.
ephemient m'a appris quelque chose: bash for ((expr;expr;expr))
des constructions. Depuis je n'ai jamais lu toute la page de manuel de bash (comme je l'ai fait avec le ksh page de man, et c'était il y a longtemps), j'ai manqué.
Donc,
typeset -i i END # let's be explicit
for ((i=1;i<=END;++i)); do echo $i; done
semble être le plus efficace de la mémoire manière (il ne sera pas nécessaire d'allouer de la mémoire à consommer seq
s'sortie, qui pourrait être un problème si la FIN est très grand), mais probablement pas le "le plus rapide".
la question initiale
eschercycle de noter que l' {a..b} bash notation ne fonctionne qu'avec des littéraux; vrai, en conséquence, pour le bash manuel. On peut surmonter cet obstacle avec un seul (interne) fork()
sans exec()
(comme c'est le cas avec l'appel de seq
, ce qui est un autre image nécessite un fork+exec):
for i in $(eval echo "{1..$END}"); do
Les deux eval
et echo
sont bash objets internes, mais un fork()
est nécessaire pour la commande de substitution ( $(…)
de construire).