bash中的选项解析器比getopts更加进化

Gui*_*mas 5 bash parsing options

我操纵了许多bash脚本,这些脚本可能会更改选项。更改选项涉及三个操作:

  • 更改您提供给getopts的字符串以解析选项(:g:h:pt例如)
  • 编写代码以影响参数(opt1=$OPTARG
  • 更改使用功能(显示说明的功能)

这有点繁重,尤其是当您知道boost::program_options提供一个不错的接口来处理C ++中的选项时。

boost::program_options在Bash中有类似的东西吗?

And*_*ewD 3

使用argbash。你不会后悔的。

Argbash 文档

Argbash在后台使用getopts ,但会为您管理大部分实现,并提供跨项目更一致的解析代码库。我已经成功地使用了它,它很棒,但确实有一个学习曲线。它是一个代码生成器,可创建支持长选项和短选项的解析器脚本,并自动创建帮助文档。它甚至对手册页也有帮助。

基本步骤是:

  1. 安装argbash。您可以使用现场的安装说明进行编译,但我建议使用Docker 容器

  2. 创建一个模板 m4 文件,定义您的选项。您可以手动执行此操作或创建脚本。

    如果您使用 docker 容器,它会是这样的:

    argbash-init-docker \
    --opt myoption1 \
    --opt-bool myoption2 \
    --pos my_arg1 \
    --pos my_arg2 \
    parser.m4
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用您生成的模板作为输入运行 argbash。

    就像是:

    argbash-docker \
    parser.m4 \
    --strip user-content \
    -o parser.sh
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在将使用解析器的主脚本中,parser.sh从上一个命令的输出中获取脚本

    source ./parser.sh

  5. 参考代码中的选项

    如何引用布尔选项的示例:

     if test $_arg_myoption2 = on;then
     echo 'myoption2 is on'
     fi
    
    Run Code Online (Sandbox Code Playgroud)
  6. 测试

    ./my-script.sh --myoption2 arg1 arg2
    
    Run Code Online (Sandbox Code Playgroud)
  7. 重复

至于您对手动步骤的担忧,argbash 可以让您将其保持在最低限度。您可以达到这样的程度:您只需更新模板并运行构建脚本。我当前的实现确实有比我想要的更多的手动步骤,但我很快就会将它们自动化。

我在README-Argbash中有关于如何在我的项目中使用它的更详细的概述,您可以查看我的代码以了解我如何在主脚本中使用它。

选项 2 - 使用docopts,Bash 的docopt实现。

docopts 的缺点是它需要将 docopt 解释器单独分发给 cli 的每个用户。这对我来说是不行的。附带说明一下,Argbash 可以生成符合 docopt 的帮助文档以用作 docopt 模板。