Beachten Sie zunächst, dass $@
Anführungszeichen keinen Sinn ergeben und nicht verwendet werden sollten. $@
sollte nur in Anführungszeichen ( "$@"
) und in Listenkontexten verwendet werden.
for i in "$@"
qualifiziert sich als Listenkontext, aber hier, um die Positionsparameter zu durchlaufen, ist die kanonische, portabelste und einfachste Form:
for i
do something with "$i"
done
Um die Elemente ab dem zweiten zu durchlaufen, ist die kanonischste und portabelste Methode shift
:
first_arg=$1
shift # short for shift 1
for i
do something with "$i"
done
Danach shift
wurde das, was früher $1
war, aus der Liste entfernt (aber wir haben es gespeichert $first_arg
) und das, was früher war, $2
ist jetzt in $1
. Die Positionsparameter wurden verschoben 1
nach links (verwenden Sieshift 2
mit um 2 verschieben ...). Im Grunde ist unsere Schleife eine Schleife von dem, was früher das zweite bis zum letzten Argument war.
Mit bash
(und zsh
undksh93
, aber das war's) ist eine Alternative:
for i in "${@:2}"
do something with "$i"
done
Beachten Sie jedoch, dass dies kein Standard ist sh
daher nicht in einem Skript verwendet werden sollte, das mit beginnt #! /bin/sh -
.
In zsh
oder yash
können Sie auch Folgendes tun:
for i in "${@[3,-3]}"
do something with "$i"
done
um vom 3. zum 3. letzten Argument zu gelangen.
In zsh
, $@
wird auch als $argv
Array bezeichnet. Um also Elemente vom Anfang oder Ende der Arrays zu platzieren, können Sie auch Folgendes tun:
argv[1,3]=() # remove the first 3 elements
argv[-3,-1]=()
( shift
Kann auch geschrieben werden 1=()
inzsh
)
In bash
können Sie nur den $@
Elementen mit dem set
eingebauten Code zuweisen. Wenn Sie also 3 Elemente am Ende platzieren, ist das ungefähr so:
set -- "${@:1:$#-3}"
Und um vom 3. zum 3. letzten zu gelangen:
for i in "${@:3:$#-5}"
do something with "$i"
done
POSIX: Um die letzten 3 Elemente von zu platzieren "$@"
, müssten Sie eine Schleife verwenden:
n=$(($# - 3))
for arg do
[ "$n" -gt 0 ] && set -- "$@" "$arg"
shift
n=$((n - 1))
done
for ((i=2; i<=$#; i++)); do something with "${!i}"; done
Ich denke du willst das
shift
eingebaute. Es wird$2
in$1
,$3
in$2
usw. umbenannt.So was:
quelle
for
Schleife eintreten , dann durchlaufen Sie $ @ normal. Nach demshift
Anruf sollte $ @ seinarg2_1 arg2_2 arg2_3...
Es gibt immer den Höhlenmenschen-Ansatz:
Dies lässt
$@
intakt (falls Sie es später verwenden möchten) und durchläuft einfach jedes Argument, verarbeitet aber nicht das erste.quelle
In bash können Sie diese Schleife auch mit expliziter Indizierung schreiben:
Dies durchläuft alle Argumente vom zweiten bis zum letzten. Wenn Sie stattdessen das letzte Argument ausschließen möchten, geben Sie dies einfach ein
und wenn Sie nur jedes andere Argument nehmen möchten, schreiben Sie es als
Die Geschichte dahinter ist die arithmetische Version des
for
Built-Ins , kombiniert mit der Argumentanzahl$#
und der variablen Indirektion${…}
.Eine nette Anwendung ist, dass Sie damit innerhalb der Schleife entscheiden können, ob eine gegebene Option das darauf folgende Argument als Wert verwendet. Wenn dies der Fall ist, erhöhen Sie den Wert
i
(z. B. Schreiben: $((++i))
), um den nächsten Wert zu verbrauchen, und überspringen Sie ihn während der Iteration.quelle