2012-03-19 13 views
10

frecuencia escribo para-bucles en bash con la sintaxis conocida:Escribir un golpe de bucle con un tope de gama variable de

for i in {1..10} [...] 

Ahora, yo estoy tratando de escribir una en la parte superior es definidos por una variable:

TOP=10 
for i in {1..$TOP} [...] 

que he probado una variedad de parens, rizado-soportes, evaluaciones, etc., y por lo general a volver un error "malo sustitución".

¿Cómo puedo escribir mi ciclo for para que el límite depende de una variable en lugar de un valor codificado?

+0

posible duplicado de [Cómo hacer yo iterar sobre un rango de números en bash?] (http://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-in-bash) – l0b0

Respuesta

21

Se puede utilizar para el bucle como este para recorrer con una variable $TOP:

for ((i=1; i<=$TOP; i++)) 
do 
    echo $i 
    # rest of your code 
done 
8

Si usted tiene un sistema GNU, puede utilizar seq para generar varias secuencias, incluyendo este.

for i in $(seq $TOP); do 
    ... 
done 
+0

'seq' es no recomendado sobre la extensión de la llave. El comportamiento entre bsd/GNU no es exactamente lo mismo. – Daenyth

+0

@daenyth bueno tener en cuenta para cuando la expansión de llaves es una alternativa viable, pero el punto central de esta cuestión es que la expansión de llaves no funciona con límites variables. – Kevin

1

respuesta es en parte there: ver Ejemplo 11-12. A-estilo C para el bucle.

Aquí se presenta un resumen de allí, pero tenga en cuenta la respuesta final a su pregunta depende del intérprete bash (/bin/bash --version):

# Standard syntax. 
for a in 1 2 3 4 5 6 7 8 9 10 

# Using "seq" ... 
for a in `seq 10` 

# Using brace expansion ... 
# Bash, version 3+. 
for a in {1..10} 

# Using C-like syntax. 
LIMIT=10 
for ((a=1; a <= LIMIT ; a++)) # Double parentheses, and "LIMIT" with no "$". 

# another example 
lines=$(cat $file_name | wc -l) 
for i in `seq 1 "$lines"` 

# An another more advanced example: looping up to the last element count of an array : 
for element in $(seq 1 ${#my_array[@]}) 
Cuestiones relacionadas