İlk olarak, $@
tırnak işaretleri olmadan bir anlam ifade etmediğini ve kullanılmaması gerektiğini unutmayın. $@
sadece quot ( "$@"
) ve liste bağlamında kullanılmalıdır.
for i in "$@"
Bir liste bağlamı olarak nitelendirilir, ancak burada konumsal parametreler üzerinde dolaşmak için kanonik, en taşınabilir ve daha basit form şudur:
for i
do something with "$i"
done
Şimdi, ikinciden başlayarak elementlerin üzerinden geçmek için, kanonik ve en taşınabilir yol kullanmaktır shift
:
first_arg=$1
shift # short for shift 1
for i
do something with "$i"
done
Daha sonra shift
, eskiden olanlar $1
listeden çıkarıldı (ama onu kaydettik $first_arg
) ve eskiden olanlar $2
şimdi içeride $1
. Konumsal parametreler 1
pozisyona sola kaydırılmıştır ( shift 2
2'ye kaydırmak için kullanın ). Yani temelde, bizim döngü eskiden ikinci argüman olandan sonuncuya doğru döngü yapıyor.
Ile bash
(ve zsh
ve ksh93
, ama bu kadar), bir alternatif yapmaktır:
for i in "${@:2}"
do something with "$i"
done
Ancak bunun standart sh
sözdizimi olmadığına dikkat edin, bu nedenle başlayan bir komut dosyasında kullanılmamalıdır #! /bin/sh -
.
İçinde zsh
veya yash
şunları da yapabilirsiniz:
for i in "${@[3,-3]}"
do something with "$i"
done
3. ile 3. son argüman arasında döngü yapmak için.
İçinde zsh
, dizi $@
olarak da bilinir $argv
. Böylece, dizilerin başından veya sonundan ögeler eklemek için şunları da yapabilirsiniz:
argv[1,3]=() # remove the first 3 elements
argv[-3,-1]=()
( shift
Aynı zamanda yazılabilir 1=()
içinde zsh
)
İçinde bash
, yalnızca yerleşik olan $@
öğelere atanabilir set
, böylece uçtan 3 öğe çıkararak şöyle bir şey olur:
set -- "${@:1:$#-3}"
Ve 3. sondan 3. sırasına kadar döngü:
for i in "${@:3:$#-5}"
do something with "$i"
done
POSIXly, son 3 öğesini "$@"
açmak için bir döngü kullanmanız gerekir:
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