У меня есть следующее утверждение:

TOKENARRAY=($TOKEN)

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

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

echo ${TOKENARRAY[0]}

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

Если я сделаю:

echo ${TOKENARRAY:0}

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

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

echo ${TOKENARRAY[1]}

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

Что тут происходит? Этот скрипт должен работать в bash, но он не работает в zsh.

1 ответ1

1

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

От 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .