İ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 $1listeden çıkarıldı (ama onu kaydettik $first_arg) ve eskiden olanlar $2şimdi içeride $1. Konumsal parametreler 1pozisyona sola kaydırılmıştır ( shift 22'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 zshve ksh93, ama bu kadar), bir alternatif yapmaktır:
for i in "${@:2}"
do something with "$i"
done
Ancak bunun standart shsözdizimi olmadığına dikkat edin, bu nedenle başlayan bir komut dosyasında kullanılmamalıdır #! /bin/sh -.
İçinde zshveya 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]=()
( shiftAynı 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