Pela minha experiência com linguagens de programação e script modernas, acredito que a maioria dos programadores costuma estar acostumada a se referir ao primeiro elemento de uma matriz por 0 como índice.
Existem vantagens substanciais no uso de 1 ?
Tenho certeza que já ouvi falar de mais idiomas além do Zsh se comportando de maneira semelhante com matrizes; por mim tudo bem, pois é igualmente conveniente.
No entanto, como as linguagens de script de shell lançadas anteriormente e amplamente usadas, como ksh e bash, usam 0, por que alguém escolheria alterar esse "padrão" comum?
Minha resposta imediata à minha pergunta seria "claro que não";
então, a única explicação que posso pensar sobre esse "recurso exclusivo" das conchas seria " elas apenas fizeram isso para mostrar um pouco mais sua casca fria ".
Mas não conheço muito o Zsh ou sua história e há uma grande chance de minha teoria trivial sobre isso não fazer sentido.
Há uma explicação para isso? Ou é apenas por gosto pessoal?
csh
, que também usava indexação de matriz baseada em um.Respostas:
awk
,tcl
pelo menos, e ferramentas normalmente utilizadas a partir do shell (cut -f1-3
,head -n 3
,sort -k1,3
,cal 1 2015
,comm -1
) começam em 1.sed
,ed
,vi
número de suas linhas de 1 ...$@
começa em 1. zsh é consistente com o manuseio de$@
(como em Bourne) ou$argv
(como em csh). Veja como é confusoksh
onde${@:0:1}
não fornece o primeiro parâmetro posicional, por exemplo.$a[1]
. Isso também significa que o número de elementos é igual ao último índice (no zsh, como na maioria dos outros shells, exceto no ksh, os arrays não são escassos).a[1]
pois o primeiro elemento é consistente coma[-1]
o último.Então, na IMO, a pergunta deveria ser: o que entrou na cabeça de David Korn para fazer com que suas matrizes começassem com 0?
fonte
$0
não é um parâmetro posicional. Não faz parte$@
."$@"
é"$1" "$2" ...
. Quando se trata de funções, em muitas conchas, você vê que"$@"
são os argumentos para a função, enquanto$0
estadias o caminho do script (ou argv shell [0] quando não estiver executando um script)Eu acho que a resposta mais plausível para isso é a matriz reversa embutida
zsh
Se você tem uma matriz com 4 elementos, digamos
myvar=(1 2 3 4)
e você deseja acessar o quarto elementoprint $myvar[4]
, certo?No entanto, se você deseja criar um loop que listará os elementos dentro dessa matriz de trás para frente, é apenas uma questão de usar índices negativos:
Isso deve explicar, já que a partir do zero, você não alcançará um desses elementos, pois não há
-0
.A segunda razão por trás disso é provavelmente o código C relacionado às variáveis no zsh está usando
int
oudouble int
para definir índices de matriz, e como ele usa o complemento de dois para representar números negativos, não há como representar-0
( zero assinado ), como você pode fazer no float variáveis pontuais.Se você está realmente acostumado a índices começando em 0, sugiro que você use a
KSH_ARRAYS
opção para corrigir isso.E, tomando conta do comentário do @cuonglm, os
csh
recursos implementadoszsh
são explicados aqui . Parece não ser uma razão histórica, mas uma maneira de proporcionar um ambiente de trabalho confortável para aqueles que são usados comcsh
fonte
-
por~
.bash
. Eu acho que ele lida com índices negativos para elementos do conjunto como açúcar de sintaxe, mas depois não o faz de outra forma. não consigo lembrar. da minha perspectiva, as pessoas devem apenas criar um diretório e usar arquivos para o que quer que estejam inserindo em todo esse estado de shell. você pode indexar esses elementos da maneira que desejar.~
é inversão binária.~0
é-1
. (todos os bits invertidos dependem de como os números negativos geralmente são representados em bits). Em uma matriz não configurada ou em uma matriz com apenas um elemento do índice 0, a [0], a [-0], a [-1] e a [~ 0] fornecerão a mesma coisa em uma matriz semelhante a ksh.~
quando-index
não funcionou. Acho que provavelmente tudo o que fiz foi~-index
. sim. isso parece certo. sim! e é claro que também funciona para elementos não configurados. então eu acho que o comentário acima deve ser - para matrizes 0 indexadas adicionar~
. Eu acho que apenas lidou com a parte -1 mais fácil, talvez. Não sei. não está pulando para a vanguarda da minha memória no momento ...