代码之家  ›  专栏  ›  技术社区  ›  Vaibhav

如何在zsh中创建可以接受无序参数的脚本?

  •  0
  • Vaibhav  · 技术社区  · 6 年前

    所以我正在用zsh编写一个小脚本,它可以接受多个参数。然而,用户传递参数的顺序是错误的。例如,这将是对脚本的有效调用:

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

    现在,我可以使用位置参数,比如$1、$2等来 --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的特定解决方案。

    0 回复  |  直到 6 年前
        1
  •  9
  •   Community Mohan Dere    6 年前

    传统的shell内置命令 getopts 用于处理脚本参数。从你的例子来看,你似乎需要支持长选项(这是短选项: -s --long ),但大多数shell,包括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}"