Parsing bash中的选项解析器比getopts更先进

Parsing bash中的选项解析器比getopts更先进,parsing,bash,options,Parsing,Bash,Options,我操纵了几十个bash脚本,在这些脚本中我可能会更改选项。更改选项涉及三个操作: 更改提供给getopts的字符串以解析选项(例如,:g:h:pt) 编写影响参数的代码(opt1=$OPTARG) 更改使用功能(显示说明说明的功能) 这有点重,尤其是当你知道 /Cuth>提供了一个处理C++选项的好界面。 Bash中是否有类似于boost::program\u options的功能?使用argbash。你不会后悔的。 Argbash使用,但为您管理大部分实现,并提供跨项目的更一致的解析代码

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

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

这有点重,尤其是当你知道 /Cuth>提供了一个处理C++选项的好界面。 Bash中是否有类似于

boost::program\u options
的功能?

使用argbash。你不会后悔的。

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

基本步骤是:

  • 安装argbash。您可以使用站点上的安装说明进行编译,但我建议使用

  • 创建模板m4文件,定义选项。您可以手动执行此操作,也可以创建脚本

    如果您使用的是docker容器,它将类似于:

    argbash-init-docker \
    --opt myoption1 \
    --opt-bool myoption2 \
    --pos my_arg1 \
    --pos my_arg2 \
    parser.m4
    
  • 将生成的模板作为输入运行argbash

    比如:

    argbash-docker \
    parser.m4 \
    --strip user-content \
    -o parser.sh
    
  • 在将使用解析器的主脚本中,从上一个命令的输出中获取
    parser.sh
    脚本

    source./parser.sh

  • 参考代码中的选项

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

     if test $_arg_myoption2 = on;then
     echo 'myoption2 is on'
     fi
    
  • 试验

    ./my-script.sh --myoption2 arg1 arg2
    
  • 重复

  • 至于您对手动步骤的关注,argbash允许您将其保持在最低限度。你可以说你只是在更新模板并运行一个构建脚本。我当前的实现确实有比我想要的更多的手动步骤,但我很快就会自动完成这些步骤

    我在这里有一个关于如何在我的项目中使用它的更详细的大纲,您可以查看我的,以了解我如何在主脚本中使用它

    选项2-使用,Bash的实现。 docopts的缺点是需要将docopt解释器分别分发给cli的每个用户。这对我来说是不可能的。作为补充说明,Argbash可以生成与docopt兼容的帮助文档,用作docopt模板。

    使用getoptions。

    getoptions是一个新的选项解析器(生成器),它是用兼容POSIX的shell脚本编写的,面向那些希望在shell脚本(dash、bash、ksh、zsh和所有POSIX shell)中支持POSIX和GNU标准选项语法的人

    它速度快、体积小,同时支持缩写长选项子命令自动帮助生成等,并且非常易于使用,因为它使用纯shell函数实现,不需要任何其他工具

    它也是一个选项解析器生成器。预生成选项解析器代码消除了包含库的需要,并且使其速度更快

    示例(仅此而已):

    #/垃圾箱/垃圾箱
    版本=1.0
    解析器_定义(){
    设置REST帮助:用法缩写:true--“用法:example.sh[options][arguments]”
    msg--“选项:”
    旗A-A
    旗子B-B
    flag flag-f+f--{no-}flag--“不接受参数”
    param param-p--param--“接受一个参数”
    选项-o--“默认”-“不接受任何参数或一个参数”上的选项
    disp:usage-h--help
    disp版本--版本
    }
    评估“$(getoptions解析器_定义)退出1”
    echo“FLAG:$FLAG,PARAM:$PARAM,OPTION:$OPTION”
    printf':%s\n'$@#Rest参数
    
    script.sh-ab-f+f--flag--no flag-p1-p2--param 3--param=4--option=5--op--ab
    
    我不熟悉Boost的选项解析,但会提出和解决问题。特别是第一个,看起来很有希望。我肯定还有更多。你有什么兼容性要求吗?