Как создать сценарии в zsh, которые могут принимать неупорядоченные аргументы? - PullRequest
0 голосов
/ 30 января 2020

Итак, я пишу небольшой скрипт на zsh, который может принимать несколько аргументов. Однако пользователи случайно передают аргументы не по порядку. Например, это будет действительный вызов скрипта:

./logproc.sh --include /var/log --exclude-file-ext gz,bz --show-only

Теперь я могу использовать позиционные аргументы, такие как $ 1, $ 2 и c. ожидать --include сначала, затем --exclude-file-ext и так далее. Но пользователи вызывают сценарий так:

./logproc.sh --show-only --exclude-file-ext gz,bz --include /var/log

или

./logproc.sh --exclude-file-ext gz,bz --show-only --include /var/log

Со временем потребность в добавлении дополнительных функций возрастает, а перестановка и комбинация выяснения, какие аргументы были переданный по сценарию собираются взорваться.

Есть ли в zsh встроенный инструмент или команда (внешний инструмент, который можно вызвать в скрипте), который можно использовать для определения аргументов, которые были отправлены в скрипт?

PS: я ищу ZSH -specifi c решение.

1 Ответ

1 голос
/ 30 января 2020

Традиционно встроенная команда оболочки getopts используется для обработки параметров скрипта. Из вашего примера кажется, что вам нужна поддержка длинных опций (это короткая опция: -s, а это длинная опция --long), но большинство оболочек, включая zsh, не поддерживают длинные опции при реализации getopts. , Если абсолютно необходимо использовать POSIX-совместимый инструмент, различные его реализации, такие как getopts_long , уже существуют.

В большинстве случаев доступен другой инструмент - GNU getopt. Этот поддерживает оба варианта и по умолчанию доступен в большинстве Linux дистрибутивов. Вы можете найти исчерпывающий пример с описанием в справочных страницах getopt (3) .

zsh вариант - zparseopts

zsh с другой опцией под названием zparseopts. Вы можете найти описание и другие примеры в документации для zshmodules (1) . Наконец, вот фрагмент кода для вашего случая:

#!/bin/zsh

zparseopts -E -D -- \
           -include:=o_include \
           -exclude-file-ext:=o_exclude \
           -show-only=o_show

echo "include: ${o_include[2]}"
echo "exclude: ${o_exclude[2]}"
echo "show? ${o_show}"
...