是否存在公开可用的部分解决方案来解析* nix风格的命令行选项而无需预先知道密钥?

是否存在公开可用的部分解决方案来解析* nix风格的命令行选项而无需预先知道密钥?,第1张

是否存在公开的部分解决方案(使用任何语言),以便在预先不知道选项密钥的情况下将* nix命令行选项解析为数据结构

基本上,解析像

这样的东西
my-script -x ex --y=why zebra

并获取

{'x': 'ex', 'y': 'why'}

在解析之前不知道选项键是xy

有关于perljava的类似问题,但没有得到正面答复。

我理解“命令行选项”不是定义明确的语法,并且任何此类解决方案都不会为所有输入生成所需的输出,但我想知道是否已知任何此类部分解决方案。

最佳答案:

1 个答案:

答案 0 :(得分:3)

无法以无模式方式解析UNIX命令行选项 ,尤其是在支持GNU约定时(即允许选项和参数之间的混合)。

考虑一下你在这里给出的用法:

my-script -x ex --y=why zebra

现在,应该是:

{options: {x: "ex", y: "why"}; arguments=["zebra"]}

......或者应该是......

{options: {x: True, y: "why"}; arguments=["ex", "zebra"]}

答案是,在不知道x是否接受参数的情况下,您不知道 - 这意味着您需要一个模式。

还要考虑:

nice -n -1

-1-n的参数,还是1的关键值?再说一遍,你无法说出来。

因此:存在Schemaless命令行解析器,但是没有涵盖足够广泛有用的案例 - 因此通常在使用它们的程序中被隔离,而不是被构建到库中。

顺便说一句,bash(4.0或更新版本)中的典型无模式命令行解析器可能如下所示:

# put key/value pairs into kwargs, other arguments into args
declare -A kwargs=( )
args=( )
args_only=0
for arg; do
  if (( args_only )); then
    args =( "$arg" )
    continue
  fi
  case $arg in
    --) args_only=1 ;;
    --*=*)
      arg=${arg#--}
      kwargs[${arg%%=*}]=${arg#*=}
      ;;
    --*) kwargs[${arg#--}]=1 ;;
    -*) kwargs[${arg#-}]=1 ;;
    *) args =( "$arg" ) ;;
  esac
done

这适用于......

my-script --x=ex --y=why zebra

...产生值:

args=( zebra )
kwargs=( [x]=ex [y]=why )

......还有一些更有趣的有用案例,但距离处理一般情况还有很长的路要走。

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复