2011-04-17 4 views
45

Probablemente sea una pregunta difícil. Pero obtengo 3 argumentos de la línea de comando [script bash]. Entonces estoy tratando de usar estos en un ciclo for.Usando el rango del argumento de la línea de comandos en bash para el bucle imprime los corchetes que contienen los argumentos

for i in {$1..$2} 
    do action1 
done 

no parece que esto funcione sin embargo y si es $1"0" y $2 es 2 imprime {0..2}' and calls action1` sólo una vez. Me he referido a varios ejemplos y este parece ser el uso correcto. ¿Puede alguien decirme qué se debe arreglar aquí?

Gracias de antemano.

Respuesta

50

¿Qué tal:

for i in $(eval echo {$1..$2}); do echo $i; done 
14

¿Usa la variable $ @?

for i in [email protected] 
do 
    echo $i 
done 

Si lo que desea es utilizar primero y segundo argumento, simplemente

for i in $1 $2 

Si el $ 1 y $ 2 son números enteros y que desea crear un rango, utilice la C para la sintaxis del bucle (bash)

for ((i=$1;i<=$2;i++)) 
do 
... 
done 
+2

Es posible que desee incluir solo la segunda parte de la respuesta: es mejor que usar 'eval' y se ajusta a la pregunta. – l0b0

65

Usted puede cortar la entrada utilizando ${@:3} o ${@:3:8} y luego bucle sobre ella

Para por ejemplo., Para imprimir argumentos a partir de 3

for i in ${@:3} ; do echo $i; done 

o para imprimir 8 argumentos a partir de 3 (así, argumentos 3 a través 10)

for i in ${@:3:8} ; do echo $i; done 
6

Tuve un problema similar. Creo que el problema está en desreferenciar $ 1 dentro de los corchetes '{}'. La siguiente alternativa funcionó para mí ..

#!/bin/bash 
for ((i=$1;i<=$2;i++)) 
do 
    ... 
done 

Espero que ayude.

+0

+1 IMO Esto es más limpio que tener que 'eval' como en la respuesta aceptada, pero la respuesta aceptada es más específica para el OP – nhed

0
#/bin/bash 
for i 
do 
    echo Value: $i 
done 

Esto recorrerá todos los argumentos dados al archivo de script. Tenga en cuenta que no hay "do" ni nada más después de la variable de ciclo i.

Cuestiones relacionadas