Есть ли причина, почему первый элемент массива Zsh индексируется 1 вместо 0?

По моему опыту с современными языками программирования и написания сценариев, я считаю, что большинство программистов обычно привыкли ссылаться на первый элемент массива на 0 как индекс.
Существуют ли существенные преимущества при использовании 1 ?

Я уверен, что слышал о других языках, кроме Zsh, которые ведут себя аналогично массивам; это прекрасно, потому что это одинаково удобно.
Однако, поскольку ранее выпущенные и широко используемые языки сценариев оболочки, такие как ksh и bash, все используют 0, почему кто-то решил изменить этот общий «стандарт»?

Мой немедленный ответ на мой вопрос будет «конечно не»;
то единственное объяснение, которое я могу представить в отношении этой «исключительной функции» для оболочек, было бы « они просто сделали это, чтобы показать немного больше их классной оболочки ».

Я не знаю много ни Zsh, ни его истории, хотя есть большая вероятность, что моя тривиальная теория об этом не имеет никакого смысла.

Есть ли объяснение этому? Или это просто из личного вкуса?

  • Практически все массивы оболочек (Bourne, csh, tcsh, fish, rc, es, yash) начинаются с 1. ksh – единственное исключение, которое я знаю (bash просто скопировал ksh).
  • Большинство интерпретируемых языков в то время (начало 90-х): awk , tcl по крайней мере, и инструменты, обычно используемые из оболочки ( cut -f1-3 , head -n 3 , sort -k1,3 , cal 1 2015 , comm -1 ) начинаются с 1. sed , ed , vi номера их строк от 1 …
  • zsh берет лучшее из оболочки Bourne и csh. Массив оболочки Bourne $@ начинается с 1. zsh согласуется с его обработкой $@ (как в Bourne) или $argv (как в csh). Посмотрите, как запутанно это в ksh где ${@:0:1} не дает вам первого позиционного параметра, например.
  • Оболочка является пользовательским инструментом, прежде чем быть языком программирования. Для большинства пользователей имеет смысл иметь первый элемент в $a[1] . Это также означает, что количество элементов совпадает с последним индексом (в zsh, как в большинстве других оболочек, кроме ksh, массивы не являются разреженными).
  • a[1] для первого элемента согласуется с a[-1] для последнего.

Таким образом, ИМО должен скорее задаться вопросом: что попало в голову Дэвида Корна, чтобы его массивы начинались с 0?

Я думаю, что наиболее правдоподобным ответом на это является обратный массив, встроенный в zsh

Если у вас есть массив с 4 элементами, скажем, myvar=(1 2 3 4) и вы хотите получить доступ к 4-му элементу, он будет print $myvar[4] , правильно?

Однако, если вы хотите создать цикл, который будет перечислять элементы внутри этого массива назад, это просто вопрос использования отрицательных индексов:

 print $myvar[-1] # will print 4 print $myvar[-2] # will print 3 print $myvar[-3] # will print 2 print $myvar[-4] # will print 1 

Это должно объясняться, начиная с нуля, вы не достигнете одного из этих элементов, так как нет -0 .

Вторая причина этого заключается в том, что код C, связанный с переменными на zsh, использует int или double int для определения индексов массива, и поскольку он использует дополнение Two для представления отрицательных чисел, нет никакого способа представить -0 ( Signed zero ), например вы можете использовать переменные точки плавания.

Если вы действительно используете индексы начиная с 0, я предлагаю вам использовать параметр KSH_ARRAYS чтобы исправить это.

И, взяв комментарий @cuonglm, здесь описаны функции csh реализованные на zsh . Похоже, что это не историческая причина, а способ обеспечить комфортную рабочую среду для тех, кто используется с csh