Por que $ argv ficou vazio no zsh?

Por que $ argv ficou vazio no zsh?

arquivar um

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

echo ---

echo $argv
echo $argv[0]

quando o comando é

./a 1 2

Isto mostra:

1 2
./a
---

[0]

Quando o comando é:

zsh ./a 1 2

Isto mostra:

1 2
./a
---
1 2

Por que se um 'zsh' sendo um comando explícito pode alterar o resultado? E por que argv[0] não está atribuído?

Responder1

$0não é um parâmetro posicional, não faz parte $@, é o nome do script/função. $*, $@e $argvsão todos a mesma matriz normal (não esparsa) dos parâmetros posicionais e todos os índices da matriz começam em 1 em zsh, a menos que você habilite a ksharraysopção.

Mas se você ativar a ksharraysopção de índices de array começarem em 0, você notará que $argv[0]or ${@[0]}é o primeiro parâmetro posicional: $1.

Sua confusão pode vir de matrizes de shells do tipo ksh93 (incluindo bash), onde ${@:0:1}é $0mesmo que a expansão de "$@"não inclua $0. Essa confusão é o resultado da escolha do Korn de fazer com que seus índices de array de shell comecem em 0, mesmo que o shell Bourne no qual ele se baseia, e a maioria dos outros shells e ferramentas usadas pelo shell tenham escolhido ter seus índices de array começando em 1.

Mais sobre isso emExiste uma razão pela qual o primeiro elemento de uma matriz Zsh é indexado por 1 em vez de 0?

informação relacionada