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
$0
No es un parámetro posicional, no forma parte de $@
, es el nombre del script/función. $*
, $@
y $argv
son 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 ksharrays
opción.
Pero si habilita la ksharrays
opció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 $0
la 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?