He conseguido lo siguiente para trabajar:
for i in {2..10}
do
echo "output: $i"
done
Produce un montón de líneas de output: 2
,output: 3
, etcétera.
Sin embargo, tratando de ejecutar lo siguiente:
max=10
for i in {2..$max}
do
echo "$i"
done
produce lo siguiente:
output: {2..10}
¿Cómo puedo hacer que el compilador se dé cuenta de que debería tratar $ max como el otro extremo de la matriz y no como parte de una cadena?
echo "$i
debería serecho "$i"
, sin embargo, no solucionará el problema.do
ythen
en la misma línea quefor
yif
, respectivamente. Por ejemplo,for i in {2..10}; do
Respuestas:
La expansión de llaves , {x..y} se realiza antes de otras expansiones, por lo que no puede usarla para secuencias de longitud variable.
En su lugar, use el
seq 2 $max
método como lo indicó el usuario mob .Entonces, para su ejemplo sería:
fuente
seq
contar e incrementar números en el bucle for, por lo tanto, se recomienda evitar usarloseq
. Este comando se deja para compatibilidad con bash antiguo. Los comandos integrados son lo suficientemente rápidos.for (( EXP1; EXP2; EXP3 )) ...
for (( ... ))
sintaxis no es POSIX y eso significa, por ejemplo, que no funcionará de forma inmediata en cosas como Alpine Linux.seq
hace.#!/bin/sh
es Dash en Debian / Ubuntu.Pruebe la versión de expresión aritmética de
for
:Está disponible en la mayoría de las versiones de bash y también debe ser compatible con Bourne shell (sh).
fuente
sh
, en cambio, lo convierten en un enlace a otro shell. Idealmente, se invoca un shell de este tiposh
que solo admitiría esas características en el estándar POSIX, pero de manera predeterminada deja pasar algunas de sus características adicionales. El estilo for-loop de C no es una función POSIX, pero puede estar ensh
modo por el shell real.Paso el bucle manualmente:
Si no tiene que ser totalmente POSIX, puede usar la aritmética para el bucle:
O use jot (1) en sistemas BSD:
fuente
true $(( i++ ))
no funciona en todos los casos, por lo que sería más portátiltrue $((i=i+1))
.Hay más de una forma de hacerlo.
fuente
eval
que evaluará todo lo que establezcamax
. Consideremax="2}; echo ha; #"
, luego reemplaceecho ha
con algo más destructivo.Si el
seq
comando está disponible en su sistema:Si no, entonces use a los pobres
seq
conperl
:Mira esas comillas.
fuente
Esta es una manera:
Bash:
La forma Bash anterior también funcionará para
ksh
yzsh
cuandobash -c
se reemplaza conksh -c
ozsh -c
respectivamente.Nota:
for i in {2..${max}}; do echo $i; done
trabaja enzsh
yksh
.fuente
Podemos iterar en bucle como en la programación en C.
fuente
Aquí funcionó en Mac OS X.
Incluye el ejemplo de una fecha BSD, cómo aumentar y disminuir la fecha también:
fuente
Bueno, como no tenía el
seq
comando instalado en mi sistema (Mac OS X v10.6.1 (Snow Leopard)), terminé usando unwhile
bucle en su lugar:* Se encoge de hombros * Lo que sea que funcione.
fuente
Todos estos hacen
{1..8}
y deberían ser POSIX. Tampoco se romperán si pones un condicionalcontinue
en el bucle. La forma canónica:De otra manera:
y otro:
fuente
Utilizar:
Necesita la llamada explícita 'eval' para reevaluar el {} después de la sustitución de variables.
fuente