Это поведение может вас удивить, в зависимости от вашего опыта программирования, но оно является желаемым.
От man zshparam
относительно формы ${TOKENARRAY[exp]}
:
Индекс вида [exp]
выбирает отдельный элемент exp, где exp - это арифметическое выражение, которое будет подвергаться арифметическому расширению, как если бы оно было окружено $((...))
. Элементы нумеруются, начиная с 1, если только не установлена опция KSH_ARRAYS, в этом случае они нумеруются с нуля.
Синтаксис ${TOKENARRAY:0}
задокументирован в man zshexpn
:
${name:offset}
(...) Положительное смещение всегда обрабатывается как смещение символа или элемента в имени от первого символа или элемента массива (это отличается от нотации нативного нижнего индекса zsh). Следовательно, 0 относится к первому символу или элементу независимо от настройки опции KSH_ARRAYS.
Так что это в принципе дает ваш полный массив (не только первый элемент), начиная с первого символа.
Итак, когда вы заявляете
Этот скрипт должен работать в bash, но он не работает в zsh.
Возможно, вы захотите рассмотреть emulate sh
в вашем скрипте, который включает опцию KSH_ARRAY помимо других (emulate -l sh
дает вам список) или просто setopt KSH_ARRAYS
.