Todos sabemos que las matrices en Bash están indexadas desde cero, y en zsh están indexadas desde uno.

¿Cómo puede saber el script que debería usar 0 o 1 si no puedo asegurarme de que el entorno de ejecución sea bash, zsh u otra cosa?

Ejemplo de código esperado:

detect_array_start_index(){
  # ... how?
  echo 1
}
ARR=(ele1 ele2)
if [[ $(detect_array_start_index) = 0 ]]; then
  for (( i=$(detect_array_start_index); i < ${#ARR[@]}; i++ )); do
    echo "$i is ${ARR[$i]}"
  done
else
  for (( i=$(detect_array_start_index); i <= ${#ARR[@]}; i++ )); do
    echo "$i is ${ARR[$i]}"
  done
fi

Tengo una idea es encontrar el índice del primer valor en una matriz fija, obtuve esto: Obtiene el índice de un valor en una matriz Bash, pero la respuesta aceptada usa la sintaxis de direccionamiento indirecto de la variable bash ${!VAR[@]}, que no es válida en zsh.

1
LingSamuel 4 jun. 2020 a las 13:18

3 respuestas

La mejor respuesta

Cree una matriz con un elemento no vacío, verifique si ese elemento está en el índice 1 o no. P.ej:

detect_array_start_index() {
  local x=(y)
  case ${x[1]} in
  '') echo 0 ;;
  (y) echo 1 ;;
  esac
}
1
oguz ismail 4 jun. 2020 a las 10:49

Puede configurar la opción KSH_ARRAYS en zsh para forzar que la indexación de matriz comience en 0.

{ setopt KSH_ARRAYS || : ; } 2> /dev/null

ARR=(ele1 ele2)
for ((i=0; i < ${#ARR[@]}; i++ )); do
  echo "$i is ${ARR[$i]}"
done

El grupo de comandos y la redirección permiten que todo el comando actúe como no operativo si se ejecuta desde bash. El código anterior produce la misma salida en zsh y bash.

1
chepner 4 jun. 2020 a las 11:30