2010-08-26 5 views
38

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

+1

möglich Duplikat von [Entfernen Sie das erste Element von $ @ in bash] (http://stackoverflow.com/questions/2701400/remove-first-element-from-in-bash) – user

Antwort

22

Dies sollte es tun :

#ignore first parm1 
shift 

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

ecellet thanx :) was macht - wirst du tun? Sorry, ich weiß zu faul zu googlen – piet

+0

größer als. nur ein Vergleichsoperator für den Test :-) – Scharron

+1

Wow, das ist ziemlich faul. Probieren Sie 'help test' aus, das nur aus 9 Zeichen besteht und eine . Viel Glück. – msw

4

ein anderer Geschmack, ein bisschen kürzer das hält die Argumente Liste

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

(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. –

96

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.

+3

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

+5

@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

+0

Kann jemand die Zitate in die Antwort bearbeiten? Ich hätte fast den Kommentar verfehlt, der das Whitespace-Problem behebt. – wrtlprnft

8

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 
+2

Was macht $ {! I}? – logicor

+1

@logicor, es ist eine indirekte Erweiterung - es sucht nach dem Wert der Variablen, deren Name in der Variablen "i" steht. –

+0

BTW, '" $ {@: 2} "' ist sicherlich korrekter als '$ {*: 2}'. Sie als Alternativen zu beschreiben, ist eher untypisch. –

4

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.

+0

@CharlesDuffy: behoben –