¿Por qué $argv quedó vacío en zsh?

¿Por qué $argv quedó vacío en zsh?

presentar un

#!/bin/zsh
echo $*
echo $0

echo ---

echo $argv
echo $argv[0]

cuando el comando es

./a 1 2

Muestra:

1 2
./a
---

[0]

Cuando el comando es:

zsh ./a 1 2

Muestra:

1 2
./a
---
1 2

¿Por qué si un 'zsh' es un comando explícito puede cambiar el resultado? ¿Y por qué no se asigna argv[0]?

Respuesta1

$0No es un parámetro posicional, no forma parte de $@, es el nombre del script/función. $*, $@y $argvson todos la misma matriz normal (no dispersa) de parámetros posicionales y todos los índices de matriz comienzan en 1 en zsh a menos que habilite la ksharraysopción.

Pero si habilita la ksharraysopción para que los índices de matriz comiencen en 0, notará que $argv[0]o ${@[0]}es el primer parámetro posicional: $1.

Su confusión puede provenir de matrices de shells similares a ksh93 (incluido bash), ${@:0:1}aunque $0la expansión de "$@"no incluye $0. Esa confusión es el resultado de que Korn eligió hacer que sus índices de matriz de shell comenzaran en 0 a pesar de que el shell Bourne en el que se basa y la mayoría de los demás shells y herramientas utilizados por el shell eligieron que sus índices de matriz comenzaran en 1.

Más sobre eso en¿Hay alguna razón por la cual el primer elemento de una matriz Zsh esté indexado por 1 en lugar de 0?

información relacionada