TL;DR:
bashindexování pole začíná na0(vždy)zshindexování pole začíná na1(pokud není možnostKSH_ARRAYSje nastaveno)
Chcete-li se vždy chovat konzistentně, použijte:
${array[@]:offset:length}
Vysvětlení
Pro kód, který funguje v obou bash a zsh , musíte použít offset:length syntaxe spíše než [subscript] syntaxe.
Dokonce i pro zsh -pouze kód, budete to muset udělat (nebo použijte emulate -LR zsh ) od zsh základ indexování pole 's je určen KSH_ARRAYS možnost.
Např. odkaz na první prvek v poli:
${array[@]:0:1}
Zde array[@] jsou všechny prvky, 0 je posun (který vždy je založen na 0) a 1 je počet požadovaných prvků.
Pole v Bash jsou indexována od nuly a v zsh jsou indexována od jedné.
Ale pro jednoduchý případ použití, jako je tento, indexy nepotřebujete. Smyčka přes ${array[@]} funguje v obou:
files=(file*)
for f in "${files[@]}"; do
echo "$f"
done
V zsh můžete také použít $files místo "${files[@]}" , ale to v Bash nefunguje. (A je tu malý rozdíl, že vypustí prázdné prvky pole, ale z názvů souborů žádné nezískáte.)
Také nepoužívejte $(ls file*) , rozbije se, pokud máte názvy souborů s mezerami (viz WordSpliting na BashGuide), a je pro začátek zcela k ničemu.
Shell je dokonale schopen generovat názvy souborů sám. To je vlastně to, co se tam stane, shell najde všechny soubory s názvy odpovídajícími file* , předá je ls a ls jen je znovu vytiskne, aby je shell mohl přečíst a zpracovat.