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
$0
não é um parâmetro posicional, não faz parte $@
, é o nome do script/função. $*
, $@
e $argv
sã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 ksharrays
opção.
Mas se você ativar a ksharrays
opçã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}
é $0
mesmo 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?