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 "$idebería serecho "$i", sin embargo, no solucionará el problema.doythenen la misma línea queforyif, respectivamente. Por ejemplo,for i in {2..10}; doRespuestas:
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 $maxmétodo como lo indicó el usuario mob .Entonces, para su ejemplo sería:
fuente
seqcontar 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.seqhace.#!/bin/shes 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 tiposhque 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 enshmodo por el shell real.Paso el bucle manualmente:
i = 0 max = 10 mientras que [$ i -lt $ max] hacer echo "salida: $ i" verdadero $ ((i ++)) hechoSi 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
evalque evaluará todo lo que establezcamax. Consideremax="2}; echo ha; #", luego reemplaceecho hacon algo más destructivo.Si el
seqcomando está disponible en su sistema:Si no, entonces use a los pobres
seqconperl:Mira esas comillas.
fuente
Esta es una manera:
Bash:
La forma Bash anterior también funcionará para
kshyzshcuandobash -cse reemplaza conksh -cozsh -crespectivamente.Nota:
for i in {2..${max}}; do echo $i; donetrabaja enzshyksh.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
seqcomando instalado en mi sistema (Mac OS X v10.6.1 (Snow Leopard)), terminé usando unwhilebucle 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 condicionalcontinueen 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