Tengo el siguiente script bash:
#!/bin/bash
upperlim=10
for i in {0..10}
do
echo $i
done
for i in {0..$upperlim}
do
echo $i
done
El primer for
bucle ( sin la variable upperlim
en el control del bucle) funciona bien, pero el segundo for
bucle ( con la variable upperlim
en el control del bucle) no. ¿Hay alguna manera de que pueda modificar el segundo for
bucle para que funcione? Gracias por tu tiempo.
bash
shell
shell-script
for
Andrés
fuente
fuente
for i in {0..$((upperlim))}; do echo $i; done
no funcionaRespuestas:
La razón de esto es el orden en que ocurren las cosas en bash. La expansión de llaves se produce antes de que se expandan las variables. Para lograr su objetivo, debe usar el estilo C para el bucle:
fuente
zsh
así (pero no paracsh
,tcsh
).Para completar esto en su estilo usando nada más que elementos integrados, deberá usar eval:
Pero con
seq
:Personalmente, encuentro que el uso de
seq
es más legible.fuente
seq
es un comando externo y no está disponible en todas partes bash es.seq
", reconociendo que no es una función integrada.read
es un incorporado, por ejemplo, pero no hay razón paraeval
ello.La manera POSIX
Si le importa la portabilidad, use el ejemplo del estándar POSIX :
Salida:
Cosas que no son POSIX:
(( ))
sin dólar, aunque es una extensión común como lo menciona POSIX .[[
.[
es suficiente aquí Ver también: https://stackoverflow.com/questions/13542832/bash-if-difference-between-square-brackets-and-double-square-bracketsfor ((;;))
seq
{start..end}
, y eso no puede funcionar con variables como se menciona en el manual de Bash .let i=i+1
: POSIX 7 2. El lenguaje de comandos de Shell no contiene la palabralet
y falla enbash --posix
4.3.42el dólar
i=$i+1
podría ser requerido, pero no estoy seguro. POSIX 7 2.6.4 La expansión aritmética dice:pero leerlo literalmente no implica que se
$((x+1))
expanda yax+1
que no es una variable.fuente
Su enfoque no funcionará ya que en bash brace-expansion ocurre antes de la expansión de parámetros. Necesita expandir la variable antes.
Puede trabajar con eval :
Con el bucle While :
También puedes hacerlo con el comando seq :
Si desea ejecutar con
for i in {0..$upperlim}
, necesitará usar kornshell. p.ej:fuente