2010-08-26 18 views
38

Hola tengo el siguiente:iterar a través de los parámetros de saltarse la primera

bash_script parm1 a b c d ..n 

Quiero recorrer e imprimir todos los valores en la línea de comandos a partir de una, no desde parm1

+1

posible duplicado de [Quitar primer elemento de $ @ en bash] (http://stackoverflow.com/questions/2701400/remove-first-element-from-in-bash) – user

Respuesta

22

Esto debe hacerlo :

#ignore first parm1 
shift 

# iterate 
while test ${#} -gt 0 
do 
    echo $1 
    shift 
done 
+0

ecelletn Gracias :) lo hace - gt do? Lo siento, sé que perezoso para google – piet

+0

mayor que. solo un operador de comparación para la prueba :-) – Scharron

+1

Guau, eso es bastante vago. Pruebe 'help test' que solo tiene 9 caracteres y . Buena suerte. – msw

4

otro sabor, un poco más corto que mantiene la lista de argumentos

shift 
for i in "[email protected]" 
do 
    echo $i 
done 
+0

(También puede cambiar 'echo $ i' a' echo "$ i' '- de esa manera' ./yourscript '*' 'en realidad imprime' * ', no una lista de archivos, sino que también' ./ yourscript $ 'argument \ twith \ ttabs'' en realidad imprime pestañas, en lugar de cambiarlas a espacios). –

96

Puede "cortar" matrices en bash; en lugar de utilizar shift, podría usar

for i in "${@:2}" 
do 
    echo "$i" 
done 

[email protected] es una matriz de todos los argumentos de línea de comando, ${@:2} es la misma matriz menos el primer elemento. Las comillas dobles garantizan el manejo correcto del espacio en blanco.

+3

Tenga cuidado, ya que cortar puede causar problemas con el espacio en blanco, p. Ej. caminos globbed. El archivo 'folder/my file' se dividirá en' folder/my' y 'file' si se invoca como' ./script.sh folder/* '. La respuesta aceptada usando 'shift' y' $ 1' funciona como está previsto en este caso. – jkgeyti

+5

@jkgeyti Esto no es un problema con las rutas globbed, solo un problema con el manejo de espacios en blanco. Citando correctamente como 'for i in" $ {@: 2} "; hacer eco de "$ i"; done' corrige ese problema. – Erik

+0

¿Podría alguien editar las citas en la respuesta? Casi me habría perdido el comentario que corrige el problema del espacio en blanco. – wrtlprnft

8

Este método mantendrá el primer parámetro, en caso de que desee utilizarlo más adelante

#!/bin/bash 

for ((i=2;i<=$#;i++)) 
do 
    echo ${!i} 
done 

o

for i in ${*:2} #or use [email protected] 
do 
    echo $i 
done 
+2

¿Qué hace $ {! I}? – logicor

+1

@logicor, es una expansión indirecta: busca el valor de la variable cuyo nombre se encuentra en la variable 'i'. –

+0

BTW, '" $ {@: 2} "' es ciertamente más correcto que '$ {*: 2}'. Describirlos como alternativas es bastante fuera de lugar. –

4

Usted puede utilizar una iteración implícita para los parámetros posicionales:

shift 
for arg 
do 
    something_with $arg 
done 

Como puede ver, no tiene que incluir "[email protected]" en el for declaración.

+0

@CharlesDuffy: arreglado –

Cuestiones relacionadas