TL;DR:
bash
indexování pole začíná na0
(vždy)zsh
indexování pole začíná na1
(pokud není možnostKSH_ARRAYS
je 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.