TL; DR :
bash
l'indexation du tableau commence à0
(toujours)zsh
l'indexation du tableau commence à1
(sauf si l'optionKSH_ARRAYS
est défini)
Pour toujours obtenir un comportement cohérent, utilisez :
${array[@]:offset:length}
Explication
Pour le code qui fonctionne à la fois dans bash
et zsh
, vous devez utiliser le offset:length
syntaxe plutôt que le [subscript]
syntaxe.
Même pour zsh
-uniquement le code, vous devrez toujours le faire (ou utiliser emulate -LR zsh
) depuis zsh
La base d'abonnement au tableau de est déterminée par le KSH_ARRAYS
option.
Par exemple, pour référencer le premier élément d'un tableau :
${array[@]:0:1}
Ici, array[@]
est tous les éléments, 0
est le décalage (qui toujours est basé sur 0) et 1
est le nombre d'éléments souhaités.
Les tableaux dans Bash sont indexés à partir de zéro, et dans zsh, ils sont indexés à partir de un.
Mais vous n'avez pas besoin des index pour un cas d'utilisation simple comme celui-ci. Boucle sur ${array[@]}
fonctionne dans les deux :
files=(file*)
for f in "${files[@]}"; do
echo "$f"
done
En zsh, vous pouvez également utiliser $files
au lieu de "${files[@]}"
, mais cela ne fonctionne pas dans Bash. (Et il y a la légère différence qu'il supprime les éléments de tableau vides, mais vous n'en obtiendrez aucun des noms de fichiers.)
N'utilisez pas non plus $(ls file*)
, il se cassera si vous avez des noms de fichiers avec des espaces (voir WordSpliting sur BashGuide), et est complètement inutile pour commencer.
Le shell est parfaitement capable de générer des noms de fichiers par lui-même. C'est en fait ce qui va se passer là-bas, le shell trouve tous les fichiers dont les noms correspondent à file*
, les transmet à ls
, et ls
il suffit de les imprimer à nouveau pour que le shell les lise et les traite.