TL;DR:
bash
pengindeksan array dimulai dari0
(selalu)zsh
pengindeksan array dimulai pada1
(kecuali opsiKSH_ARRAYS
diatur)
Untuk selalu mendapatkan perilaku yang konsisten, gunakan:
${array[@]:offset:length}
Penjelasan
Untuk kode yang berfungsi di kedua bash
dan zsh
, Anda harus menggunakan offset:length
sintaks daripada [subscript]
sintaksis.
Bahkan untuk zsh
-hanya kode, Anda masih perlu melakukan ini (atau gunakan emulate -LR zsh
) sejak zsh
basis subskrip array ditentukan oleh KSH_ARRAYS
opsi.
Misalnya, untuk mereferensikan elemen pertama dalam larik:
${array[@]:0:1}
Ini, array[@]
adalah semua elemen, 0
adalah offset (yang selalu berbasis 0), dan 1
adalah jumlah elemen yang diinginkan.
Array di Bash diindeks dari nol, dan di zsh diindeks dari satu.
Tetapi Anda tidak memerlukan indeks untuk kasus penggunaan sederhana seperti ini. Mengulangi ${array[@]}
berfungsi di keduanya:
files=(file*)
for f in "${files[@]}"; do
echo "$f"
done
Di zsh Anda juga bisa menggunakan $files
bukannya "${files[@]}"
, tapi itu tidak berhasil di Bash. (Dan ada sedikit perbedaan yang menjatuhkan elemen larik kosong, tetapi Anda tidak akan mendapatkannya dari nama file.)
Juga, jangan gunakan $(ls file*)
, itu akan rusak jika Anda memiliki nama file dengan spasi (lihat WordSpliting di BashGuide), dan sama sekali tidak berguna untuk memulai.
Shell sangat mampu menghasilkan nama file dengan sendirinya. Itulah yang sebenarnya akan terjadi di sana, shell menemukan semua file dengan nama yang cocok dengan file*
, meneruskannya ke ls
, dan ls
cukup cetak lagi untuk dibaca dan diproses oleh shell.