Pertama, perhatikan bahwa $@tanpa tanda kutip tidak masuk akal dan tidak boleh digunakan. $@seharusnya hanya digunakan dikutip ( "$@") dan dalam konteks daftar.
for i in "$@" memenuhi syarat sebagai konteks daftar, tetapi di sini, untuk mengulang parameter posisi, bentuk kanonik, paling portabel dan lebih sederhana adalah:
for i
do something with "$i"
done
Sekarang, untuk mengulang elemen mulai dari yang kedua, cara kanonik dan paling portabel adalah dengan menggunakan shift:
first_arg=$1
shift # short for shift 1
for i
do something with "$i"
done
Setelah itu shift, apa yang dulu $1telah dihapus dari daftar (tapi kami telah menyimpannya $first_arg) dan apa yang dulu ada di $2sekarang $1. Parameter posisi telah digeser 1 posisi ke kiri (gunakan shift 2untuk menggeser oleh 2 ...). Jadi pada dasarnya, perulangan kita adalah perulangan dari apa yang dulunya adalah argumen kedua ke argumen terakhir.
Dengan bash(dan zshdan ksh93, tapi hanya itu), alternatifnya adalah dengan melakukan:
for i in "${@:2}"
do something with "$i"
done
Tetapi perhatikan bahwa itu bukan shsintaks standar sehingga tidak boleh digunakan dalam skrip yang dimulai #! /bin/sh -.
Di zshatau yash, Anda juga dapat melakukan:
for i in "${@[3,-3]}"
do something with "$i"
done
untuk mengulang dari argumen terakhir ke 3 ke 3.
In zsh, $@juga dikenal sebagai $argvarray. Jadi untuk memunculkan elemen dari awal atau akhir array, Anda juga dapat melakukan:
argv[1,3]=() # remove the first 3 elements
argv[-3,-1]=()
( shiftdapat juga ditulis 1=()dalam zsh)
Di bash, Anda hanya dapat menetapkan $@elemen dengan setbuiltin, jadi untuk menghilangkan 3 elemen pada akhirnya, itu akan menjadi seperti:
set -- "${@:1:$#-3}"
Dan untuk mengulang dari 3 ke 3 terakhir:
for i in "${@:3:$#-5}"
do something with "$i"
done
POSIXly, untuk memunculkan 3 elemen terakhir "$@", Anda harus menggunakan loop:
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