Hallo überspringen ich habe folgendes:Iterate durch Parameter, die die ersten
bash_script parm1 a b c d ..n
Ich möchte alle Werte in der Befehlszeile zu durchlaufen und einen Druck von einem Ausgang, nicht von parm1
Hallo überspringen ich habe folgendes:Iterate durch Parameter, die die ersten
bash_script parm1 a b c d ..n
Ich möchte alle Werte in der Befehlszeile zu durchlaufen und einen Druck von einem Ausgang, nicht von parm1
Dies sollte es tun :
#ignore first parm1
shift
# iterate
while test ${#} -gt 0
do
echo $1
shift
done
ein anderer Geschmack, ein bisschen kürzer das hält die Argumente Liste
shift
for i in "[email protected]"
do
echo $i
done
(Sie können auch 'echo $ i' in' echo "$ i" 'ändern - so wird' ./yourscript '*' 'tatsächlich' * ', keine Liste von Dateien, sondern auch' ./ Ihr Skript $ 'argument \ twith \ ttabs' 'druckt Tabs, anstatt sie in Leerzeichen zu ändern. –
Sie können Arrays in Bash "Slice"; stattdessen shift
verwenden, könnten Sie verwenden
for i in "${@:2}"
do
echo "$i"
done
[email protected]
ist ein Array aller Befehlszeilenargumente, ist ${@:2}
das gleiche Array weniger das erste Element. Die doppelten Anführungszeichen sorgen für eine korrekte Whitespace-Behandlung.
Seien Sie vorsichtig, da das Schneiden Probleme mit Leerzeichen in z.B. globbed Pfade. Die Datei 'folder/my file' wird in' folder/my' und 'file' aufgeteilt, wenn sie als' ./script.sh folder/* 'aufgerufen wird. Die akzeptierte Antwort, die "shift" und "$ 1" verwendet, funktioniert in diesem Fall wie beabsichtigt. – jkgeyti
@jkgeyti Dies ist kein Problem mit globbed-Pfaden, nur ein Problem mit Whitespace-Behandlung. Richtig zitieren wie 'für i in $ {@: 2}"; echo "$ i"; done' behebt dieses Problem. – Erik
Kann jemand die Zitate in die Antwort bearbeiten? Ich hätte fast den Kommentar verfehlt, der das Whitespace-Problem behebt. – wrtlprnft
Diese Methode wird die erste param halten, falls Sie es wünschen
#!/bin/bash
for ((i=2;i<=$#;i++))
do
echo ${!i}
done
oder
for i in ${*:2} #or use [email protected]
do
echo $i
done
Was macht $ {! I}? – logicor
@logicor, es ist eine indirekte Erweiterung - es sucht nach dem Wert der Variablen, deren Name in der Variablen "i" steht. –
BTW, '" $ {@: 2} "' ist sicherlich korrekter als '$ {*: 2}'. Sie als Alternativen zu beschreiben, ist eher untypisch. –
später verwenden können Sie eine implizite Iteration für die Positionsparameter verwenden:
shift
for arg
do
something_with $arg
done
Wie Sie sehen können, müssen Sie "[email protected]"
innicht einschließen 0 Aussage.
@CharlesDuffy: behoben –
möglich Duplikat von [Entfernen Sie das erste Element von $ @ in bash] (http://stackoverflow.com/questions/2701400/remove-first-element-from-in-bash) – user