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