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
シェルが読み取って処理できるように、それらを再度出力するだけです。