TL;DR:
bash配列のインデックスは0から始まります (常に)zsh配列のインデックスは1から始まります (オプションKSH_ARRAYSを除く) 設定されています)
常に一貫した動作を得るには、次を使用します:
${array[@]:offset:length}
説明
bash の両方で動作するコードの場合 と zsh 、 offset:length を使用する必要があります [subscript] ではなく構文 構文。
zsh でも -only コード、これを行う必要があります (または emulate -LR zsh を使用します) ) zsh 以降 の配列添字の基準は KSH_ARRAYS によって決定されます オプション。
たとえば、配列の最初の要素を参照するには:
${array[@]:0:1}
ここでは、array[@] すべての要素、0 はオフセットです (常に 0 ベース)、および 1 必要な要素の数です。
Bash の配列は 0 からインデックス付けされ、zsh では 1 からインデックス付けされます。
ただし、このような単純なユース ケースではインデックスは必要ありません。 ${array[@]} をループする 両方で動作します:
files=(file*)
for f in "${files[@]}"; do
echo "$f"
done
zsh では $files も使用できます "${files[@]}" の代わりに 、しかしそれはBashでは機能しません。 (そして、空の配列要素をドロップするというわずかな違いがありますが、ファイル名からは何も得られません。)
また、$(ls file*) は使用しないでください。 、ファイル名にスペースが含まれていると壊れてしまい(BashGuideのWordSplitingを参照)、そもそもまったく役に立ちません。
シェルは、それ自体でファイル名を完全に生成できます。シェルは file* に一致する名前を持つすべてのファイルを検索します。 、それらを ls に渡します 、および ls シェルが読み取って処理できるように、それらを再度出力するだけです。