2012-03-19 10 views
10

Mi capita spesso scrivo per-loop in bash con la sintassi ben noto:Scrivi bash per-ciclo con un top-end variabile

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

Ora, sto cercando di scrivere uno in cui la parte superiore è definito da una variabile:

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

ho provato una varietà di parentesi graffe, staffe, valutazioni, ecc, e in genere ottenere indietro un errore "cattivo sostituzione".

Come posso scrivere il mio ciclo in modo che il limite dipenda da una variabile anziché da un valore codificato?

+0

possibile duplicato di [Come faccio iterare su un intervallo di numeri in bash?] (http://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-in-bash) – l0b0

risposta

21

È possibile utilizzare per il ciclo come questo per iterare con una variabile $TOP:

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

Se si dispone di un sistema GNU, è possibile utilizzare seq per generare varie sequenze, tra cui questo.

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

'seq' è non consigliato su espansione brace. Il comportamento tra bsd/gnu non è esattamente lo stesso. – Daenyth

+0

@daenyth buona nota quando l'espansione delle parentesi graffe è un'alternativa valida, ma l'intero punto di questa domanda è che l'espansione delle parentesi non funziona con i limiti delle variabili. – Kevin

1

risposta è parzialmente there: vedi Esempio 11-12. Uno stile C per il loop.

Ecco una sintesi da lì, ma essere consapevoli la risposta finale alla tua domanda dipende dal vostro interprete 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[@]})