Использование массивов в ZSH

у меня есть следующее заявление:

TOKENARRAY=($TOKEN)

$TOKEN - это числовая переменная.

если я попробую это:

echo ${TOKENARRAY[0]}

он показывает мне пустую строку.

если я делаю:

echo ${TOKENARRAY:0}

он показывает мне маркер

но действительно странно то, что если я делаю:

echo ${TOKENARRAY[1]}

он показывает мне знак.

что здесь происходит?
Этот сценарий должен работать в bash, но он не работает в zsh.

2
задан Cyrus
01.03.2023 12:19 Количество просмотров материала 3492
Распечатать страницу

1 ответ

это поведение может удивить вас, в зависимости от вашего программирования фона,но это желаемый.

С man zshparam по форме ${TOKENARRAY[exp]}:

Нижний индекс вида [exp] выбирает один элемент exp, где exp-арифметическое выражение, которое будет подвергаться арифметическому разложению, как если бы оно было окружено $((...)). элементы нумеруются начиная с 1, если не установлен параметр KSH_ARRAYS, в котором если они пронумерованы от нуля.

синтаксис ${TOKENARRAY:0} описанное в man zshexpn:

${name:offset} (...) Положительное смещение всегда рассматривается как смещение символа или элемента в имени от первого символа или элемента массива (это отличается от собственного обозначения индекса zsh). следовательно 0 ссылается к первому характеру или элементу независимо от установки варианта KSH_ARRAYS.

так что это в принципе дает complete массив (а не только первый элемент), начиная с первого символа.

Итак, когда вы в состоянии

этот скрипт должен работать в bash, но он не работает в zsh.

вы можете рассмотреть emulate sh в вашем скрипте, который включает опцию ksh_array помимо других (emulate -l sh дает список) или просто setopt KSH_ARRAYS.

1
отвечен mpy 2023-03-02 20:07

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх