2010-08-26 16 views
38

Ciao ho il seguente:Scorrere i parametri saltare la prima

bash_script parm1 a b c d ..n 

voglio iterare e stampare tutti i valori nella riga di comando a partire da una, non dal parm1

+1

possibile duplicato del [Rimuovi primo elemento da $ @ in bash] (http://stackoverflow.com/questions/2701400/remove-first-element-from-in-bash) – user

risposta

22

Questo dovrebbe farlo :

#ignore first parm1 
shift 

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

ecelletn thanx :) cosa fa - fare? dispiace So troppo pigro per google – piet

+0

superiore. solo un operatore di confronto per il test :-) – Scharron

+1

Wow, è piuttosto pigro. Prova 'help test' che ha solo 9 caratteri e un . In bocca al lupo. Il test uomo – msw

4

un altro sapore, un po 'più breve che mantiene la lista argomenti

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

(Si potrebbe anche modificare 'echo $ I' a' echo "$ i" '- in questo modo' ./yourscript '*' 'effettivamente stampe' '*, non un elenco di file, ma significa anche che' ./ yourscript $ 'argument \ twith \ ttabs'' in realtà stampa le schede, invece di farle cambiare in spazi). –

96

è possibile "fetta" array in bash; invece di usare shift, si potrebbe utilizzare

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

[email protected] è un array di tutti gli argomenti della riga comandi, ${@:2} è la stessa matrice inferiore del primo elemento. Le doppie virgolette assicurano la corretta gestione degli spazi bianchi.

+3

Fai attenzione, poiché l'affettatura potrebbe causare problemi con spazi bianchi, ad es. percorsi globbed. Il file 'cartella/il mio file' sarà diviso a' cartella/my' e 'file' se invocato come' cartella ./script.sh/* '. La risposta accettata usando 'shift' e' $ 1' funziona come previsto in questo caso. – jkgeyti

+5

@jkgeyti Questo non è un problema con i percorsi globbed, solo un problema con la gestione spazio bianco. Citando correttamente come 'for i in" $ {@: 2} "; fai eco "$ i"; done' risolve questo problema. – Erik

+0

Qualcuno potrebbe modificare le virgolette nella risposta? Mi sarei quasi perso il commento che risolve il problema dello spazio bianco. – wrtlprnft

8

Questo metodo non mancherà di tenere il primo parametro, nel caso in cui si desidera utilizzare in un secondo momento

#!/bin/bash 

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

o

for i in ${*:2} #or use $@ 
do 
    echo $i 
done 
+2

Cosa fa $ {! I}? – logicor

+1

@logicor, è un'espansione indiretta - cerca il valore della variabile il cui nome è nella variabile 'i'. –

+0

BTW, '" $ {@: 2} "' è sicuramente più corretto di '$ {*: 2}'. Descrivendoli come alternative è piuttosto off-the-mark. –

4

È possibile utilizzare un'iterazione implicita per i parametri posizionali:

shift 
for arg 
do 
    something_with $arg 
done 

Come si può vedere, non è necessario includere "[email protected]" nel for affermazione

+0

@CharlesDuffy: corretto –

Problemi correlati