TL;DR:
bash
la indexación de matrices comienza en0
(siempre)zsh
la indexación de matrices comienza en1
(a menos que la opciónKSH_ARRAYS
está configurado)
Para obtener siempre un comportamiento coherente, utilice:
${array[@]:offset:length}
Explicación
Para código que funciona en ambos bash
y zsh
, necesitas usar el offset:length
sintaxis en lugar de [subscript]
sintaxis.
Incluso para zsh
-solo código, aún deberá hacer esto (o usar emulate -LR zsh
) desde zsh
La base de subíndice de la matriz está determinada por el KSH_ARRAYS
opción.
Por ejemplo, para hacer referencia al primer elemento de una matriz:
${array[@]:0:1}
Aquí, array[@]
son todos los elementos, 0
es el desplazamiento (que siempre está basado en 0) y 1
es el número de elementos deseado.
Las matrices en Bash se indexan desde cero y en zsh se indexan desde uno.
Pero no necesita los índices para un caso de uso simple como este. Bucle sobre ${array[@]}
funciona en ambos:
files=(file*)
for f in "${files[@]}"; do
echo "$f"
done
En zsh también podrías usar $files
en lugar de "${files[@]}"
, pero eso no funciona en Bash. (Y existe la ligera diferencia de que elimina elementos de matriz vacíos, pero no obtendrá ninguno de los nombres de archivo).
Además, no uses $(ls file*)
, se romperá si tiene nombres de archivo con espacios (consulte WordSpliting en BashGuide) y, para empezar, es completamente inútil.
El shell es perfectamente capaz de generar nombres de archivo por sí mismo. Eso es realmente lo que sucederá allí, el shell encuentra todos los archivos con nombres que coincidan con file*
, los pasa a ls
y ls
simplemente los imprime de nuevo para que el shell los lea y los procese.