zparseopts с ассоциативным массивом в старой версии zsh

zparseopts с ассоциативным массивом в старой версии zsh

Меня сбивает с толку разное поведение zparseoptsв двух разных версиях zsh. По сути, я пытаюсь задать список значений параметров по умолчанию в ассоциативном массиве и перезаписать эти значения по умолчанию любыми параметрами, указанными в командной строке. Приведенный ниже код хорошо работает для zsh 5.0.6, но ведет себя странно для 4.3.6 — в частности, в zsh 4.3.6 весь мой массив значений по умолчанию перезаписывается, если перезаписывается один ключ.

мойскрипт

typeset -A opts
opts=(
--opt1 a
--opt2 b
)

zparseopts -A opts -K -- -opt1: -opt2:
echo ${(k)opts}

Запуск скрипта

$ myscript 
--opt1 --opt2  # both zsh 4.3.6 and 5.0.6

$ myscript --opt1 x
--opt1 --opt2  # zsh 5.0.6; element of array is replaced
--opt1         # zsh 4.3.6; adding an element overwrites the whole array, no more opt2

-KТакое поведение сбивает с толку, поскольку в версиях 4.3.6 и 5.0.6 записи для параметра идентичны zparseopts:

-K С этой опцией массивы, указанные с опциями -a и -A и с формами `=array', остаются неизменными, когда ни одна из спецификаций для них не используется. Это позволяет назначать им значения по умолчанию перед вызовом zparseopts.

решение1

Замените последнюю строку вашего скрипта на echo ${(kv)opts}. Запуск с 4.3.6 и 5.0.6 должен показать, что 4.3.6 интерпретирует -Kсброс opts, еслилюбойпараметры указаны, а 5.0.6сбрасывается только opts[--opt1]при --opt1использовании (оставляя --opt2любую другую запись в покое).

(Обратите внимание, что это, похоже, изменилось где-то между версиями 5.0.2 и 5.0.6; вы можете спросить об этом в списке рассылки zsh-workers, чтобы подтвердить это.)=

Связанный контент