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 shiftwurde das, was früher $1war, aus der Liste entfernt (aber wir haben es gespeichert $first_arg) und das, was früher war, $2ist 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 zshundksh93 , 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 zshoder yashkö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 $argvArray 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]=()
( shiftKann auch geschrieben werden 1=()inzsh )
In bashkönnen Sie nur den $@Elementen mit dem seteingebauten 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