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
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
Esto debe hacerlo :
#ignore first parm1
shift
# iterate
while test ${#} -gt 0
do
echo $1
shift
done
otro sabor, un poco más corto que mantiene la lista de argumentos
shift
for i in "[email protected]"
do
echo $i
done
(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). –
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.
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
@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
¿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
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
¿Qué hace $ {! I}? – logicor
@logicor, es una expansión indirecta: busca el valor de la variable cuyo nombre se encuentra en la variable 'i'. –
BTW, '" $ {@: 2} "' es ciertamente más correcto que '$ {*: 2}'. Describirlos como alternativas es bastante fuera de lugar. –
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.
@CharlesDuffy: arreglado –
posible duplicado de [Quitar primer elemento de $ @ en bash] (http://stackoverflow.com/questions/2701400/remove-first-element-from-in-bash) – user