J'ai le script bash suivant:
#!/bin/bash
upperlim=10
for i in {0..10}
do
echo $i
done
for i in {0..$upperlim}
do
echo $i
done
La première for
boucle ( sans la variable upperlim
dans le contrôle de boucle) fonctionne correctement, mais pas la deuxième for
boucle ( avec la variable upperlim
dans le contrôle de boucle). Est-il possible de modifier la seconde for
boucle pour qu'elle fonctionne? Merci pour votre temps.
bash
shell
shell-script
for
Andrew
la source
la source
for i in {0..$((upperlim))}; do echo $i; done
ne fonctionne pasRéponses:
La raison en est l’ordre dans lequel les choses se passent pendant le bash. L'expansion d'accolade se produit avant que les variables ne soient développées. Pour atteindre votre objectif, vous devez utiliser le style C pour la boucle:
la source
zsh
aussi bien (mais pas pourcsh
,tcsh
).Pour compléter ceci dans votre style en utilisant uniquement des éléments intégrés, vous devez utiliser eval:
Mais avec
seq
:Personnellement, je trouve que l'utilisation de
seq
est plus lisible.la source
seq
est une commande externe et n’est pas disponible partout où bash l’est.seq
", reconnaissant que ce n'était pas intégré.read
est intégré, par exemple, mais il n’ya aucune raisoneval
.La façon POSIX
Si vous vous souciez de la portabilité, utilisez l' exemple du standard POSIX :
Sortie:
Choses qui ne sont pas POSIX:
(( ))
sans dollar, bien que ce soit une extension commune comme mentionné par POSIX lui-même .[[
.[
est suffisant ici. Voir aussi: https://stackoverflow.com/questions/13542832/bash-if-difference-between-square-brackets-and-double-square-bracketsfor ((;;))
seq
{start..end}
, et cela ne peut pas fonctionner avec les variables mentionnées dans le manuel de Bash .let i=i+1
: POSIX 7 2. Le langage de commande Shell ne contient pas le motlet
et échoue lebash --posix
4.3.42le dollar à
i=$i+1
peut être nécessaire, mais je ne suis pas sûr. POSIX 7 2.6.4 Expansion arithmétique dit:mais le lire littéralement n'implique pas que se
$((x+1))
développe carx+1
n'est pas une variable.la source
Votre approche ne fonctionnera pas car, dans Bash, l’expansion se produit avant l’extension des paramètres. Vous devez développer la variable avant.
Vous pouvez contourner eval :
Avec boucle While :
Vous pouvez aussi le faire avec la commande seq :
Si vous voulez courir avec
for i in {0..$upperlim}
vous devrez utiliser kornshell. par exemple:la source