]> Sergey Matveev's repositories - stargrave-blog.git/commit
zparseopts вместо getopts
authorSergey Matveev <stargrave@stargrave.org>
Wed, 10 May 2023 10:31:31 +0000 (13:31 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 10 May 2023 11:11:20 +0000 (14:11 +0300)
commitf1e94e29c698bd514d4f08fea7775508fe22c8c7
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904
parentab6b31e91a689c6e086a12b7b3e362f9ced67fd4
zparseopts вместо getopts

https://linux.die.net/man/1/zshmodules
https://www.zsh.org/mla/users/2011/msg00350.html
Спустя столько лет у меня появился zsh скрипт с опциональными
аргументами. Передавал я их через переменные окружения, что не очень
удобно. Наверняка же в zsh есть какой-нибудь helper для парсинга
аргументов? В моём скрипте мне хватило всего лишь просто помещения в
один ассоциативный массив значений длинных опций.

В рассылке привели более сложный пример с короткими и длинными опциями:

    while getopts dhv opt ; do
        case $opt in
        (d)  setopt xtrace;;
        (h)  print_help
             exit;;
        (v)  print_version
             exit;;
        esac
    done

Если поместить -d и --debug в $opthash[d], то проверить наличие ключа
можно ${opthash[(i)-d|--debug]}. Можно использовать разные массивы:

    local -a debug help vers usage
    zparseopts \
        d=debug -debug=debug \
        h=help -help=help \
        v=vers -version=vers

и $+debug[1] покажет был ли использован debug.
Ну а обработать результат zparseopts можно так:

    [[ -n $debug ]] && setopt xtrace
    [[ -n $version ]] && print_version
    [[ -n $help ]] && print_help
    [[ -n "$help$version" ]] && exit