Desde mi experiencia con los lenguajes modernos de programación y scripting, creo que la mayoría de los programadores están acostumbrados a referirse al primer elemento de una matriz por 0 como índice.
¿Hay alguna ventaja sustancial en el uso de 1 ?
Estoy seguro de que he oído hablar de más lenguajes distintos de Zsh que se comportan de manera similar con las matrices; está bien para mí, ya que es igualmente conveniente.
Sin embargo, como los lenguajes de script de shell lanzados anteriormente y ampliamente utilizados, como ksh y bash, todos usan 0, ¿por qué alguien elegiría alterar este "estándar" común?
Mi respuesta inmediata a mi pregunta sería "por supuesto que no";
entonces, la única explicación que se me ocurre con respecto a esta "característica exclusiva" de los shells sería " simplemente hicieron esto para mostrar un poco más su cool shell ".
Sin embargo, no sé mucho sobre Zsh o su historia, y existe una gran posibilidad de que mi teoría trivial sobre esto no tenga ningún sentido.
¿Hay alguna explicación para esto? ¿O es solo por gusto personal?
csh
, que también usó indexación de matriz basada en uno.Respuestas:
awk
,tcl
al menos, y normalmente se utilizan herramientas de la concha (cut -f1-3
,head -n 3
,sort -k1,3
,cal 1 2015
,comm -1
) comienzan en 1.sed
,ed
,vi
números de sus líneas de 1 ...$@
comienza en 1. zsh es coherente con su manejo de$@
(como en Bourne) o$argv
(como en csh). Vea cuán confuso es enksh
donde${@:0:1}
no le da el primer parámetro posicional, por ejemplo.$a[1]
. También significa que el número de elementos es el mismo que el último índice (en zsh como en la mayoría de los otros shells, excepto ksh, los arrays no son escasos).a[1]
porque el primer elemento es consistente cona[-1]
el último.Entonces, en mi opinión, la pregunta debería ser: ¿qué se le ocurrió a David Korn para que sus matrices comenzaran en 0?
fuente
$0
no es un parámetro posicional. No es parte de$@
."$@"
es"$1" "$2" ...
. Cuando se trata de funciones, en muchos shells, verá que"$@"
son los argumentos de la función, mientras se$0
mantiene la ruta del script (o shell argv [0] cuando no se ejecuta un script)Creo que la respuesta más plausible a esto es la matriz inversa incorporada de
zsh
Si tiene una matriz con 4 elementos, digamos
myvar=(1 2 3 4)
y desea acceder al cuarto elementoprint $myvar[4]
, ¿no?Sin embargo, si desea crear un bucle que enumere los elementos dentro de esta matriz al revés, es solo cuestión de usar índices negativos:
Esto debería explicar, ya que a partir de cero, no alcanzará uno de esos elementos ya que no existe
-0
.La segunda razón detrás de esto es probablemente el código C relacionado con las variables en zsh que está usando
int
odouble int
para definir índices de matriz, y dado que usa el Complemento de dos para representar números negativos, no hay forma de representar-0
( Firmado cero ), como puede hacer en flotante variables puntuales.Si realmente está acostumbrado a los índices que comienzan en 0, le sugiero que use la
KSH_ARRAYS
opción para solucionar esto.Y tomando el gancho del comentario de @cuonglm, las
csh
características implementadaszsh
se explican aquí . Parece que no es una razón histórica, sino una forma de proporcionar un ambiente de trabajo confortable para quienes están acostumbrados acsh
fuente
-
con~
.bash
. Creo que maneja los índices negativos para los elementos establecidos como el azúcar de sintaxis, pero no lo hace de otra manera. No puedo recordar desde mi punto de vista, la gente debería crear un directorio y usar archivos para lo que sea que llenen en todo ese estado de shell. puede indexar esos elementos de la forma que desee.~
Es la inversión binaria.~0
es-1
. (todos los bits se voltearon, se basa en cómo los números negativos generalmente se representan en forma de bits). En una matriz no establecida o una matriz con solo un elemento de índice 0, un [0], un [-0], un [-1] y un [~ 0] le darán lo mismo en una matriz tipo ksh.~
cuando-index
no funcionó. Supongo que probablemente todo lo que hice fue~-index
. sí. Eso suena bien. ¡sí! y, por supuesto, eso también funciona para elementos no definidos. así que supongo que el comentario anterior debería ser: para matrices indexadas 0 agregar~
. Supongo que solo manejó la parte -1 más fácil tal vez. no se. no está saltando a la vanguardia de mi memoria en este momento ...