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
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
Questo dovrebbe farlo :
#ignore first parm1
shift
# iterate
while test ${#} -gt 0
do
echo $1
shift
done
un altro sapore, un po 'più breve che mantiene la lista argomenti
shift
for i in "[email protected]"
do
echo $i
done
(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). –
è 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.
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
@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
Qualcuno potrebbe modificare le virgolette nella risposta? Mi sarei quasi perso il commento che risolve il problema dello spazio bianco. – wrtlprnft
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
Cosa fa $ {! I}? – logicor
@logicor, è un'espansione indiretta - cerca il valore della variabile il cui nome è nella variabile 'i'. –
BTW, '" $ {@: 2} "' è sicuramente più corretto di '$ {*: 2}'. Descrivendoli come alternative è piuttosto off-the-mark. –
È 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
@CharlesDuffy: corretto –
possibile duplicato del [Rimuovi primo elemento da $ @ in bash] (http://stackoverflow.com/questions/2701400/remove-first-element-from-in-bash) – user