2017-06-14 3 views
3

Ich habe mehr als 400 Koordinaten, die ich als Argument in eine Zeichenfolge übergeben möchte, aber ich weiß nicht, wie man das erste Argument als "lat" und zweites Argument als " lng "und so weiter für den Rest.Iterieren über Befehlszeilenargumentpaare

sagen, ich war in diesem

./test 1 2 3 4 

Ich möchte meine Ausgabe

coordinate: {lat: 1, lng: 2} 
coordinate: {lat: 3, lng: 4} 

Das ist, was ich habe, so weit, aber offensichtlich ist dies nicht, wie es gemacht werden vorbei.

for i in [email protected] 
do 

    echo "coordinate: {lat: $i, lng: $i}" 

done 
+0

BTW, als beiseite, 'für i in $ @' ist eigentlich ziemlich buggy - es wird './yourscript" eins zwei "" drei vier "' genau das gleiche wie './Yourscript" one " "zwei" "drei" "vier". Zitiere immer '" $ @ "'. –

Antwort

4
#!/usr/bin/env bash 
while (("$#" >= 2)); do 
    echo "coordinate: {lat: $1, lng: $2}" 
    shift 2 
done 

Beachten Sie, dass shift; shift in vielen Kreisen über shift 2 bevorzugt ist, wie es funktioniert selbst da ist nur noch ein Argument übrig; shift 2 ist sicher nur über, weil wir $# vergleichen, um sicherzustellen, dass es immer zwei oder mehr Argumente gibt.

+0

Danke mein Herr, das war sehr hilfreich. –

0

könnten Sie verwenden shift (aber tun es nicht so - siehe Kommentar unten):

while [ -n "$1" ] 
do 
    echo "{coordinate: {lat: $1, lng $2}" 
    shift 2 
done 
+0

Dies behandelt eine leere Zeichenfolge genauso wie ein nicht existierendes Argument - './scriptname" "" "drei vier" wird nie zu dem "drei"/"vier" Paar kommen. –

+0

Wenn Sie eine ungerade Anzahl von Argumenten haben, kann 'shift 2' auch ein Noop sein (gibt einen Exit-Status ungleich Null zurück, hat aber keinen Effekt und belässt den vorhandenen Wert in $ 1), was zu einer Endlosschleife führt. –

+0

@CharlesDuffy Ok danke –

3

Sie brauchen nicht eine Schleife:

printf "coordinate: {lat: %s, lng: %s}\n" "[email protected]" 

Und Ihr Skript umbenennen, bevor Sie in Ihrem Pfad (so etwas wie/usr/local/bin) setzen, da test eine eingebaute Funktion ist.

+1

Es ist mir wirklich peinlich, dass ich das verpasst habe; Du hast vollkommen recht. –