【问题标题】:bash tools for parsing arguments用于解析参数的 bash 工具
【发布时间】:2011-02-20 12:45:26
【问题描述】:

我有一个使用一些变量的 bash 脚本(称它们为 $foo$bar)。现在脚本在顶部用硬编码值定义它们,如下所示:

foo=fooDefault
bar=barDefault

....

# use $foo and $bar

我想要的是能够像以下任何一个一样使用脚本:

myscript              # use all defaults
myscript -foo=altFoo  # use default bar
myscript -bar=altBar  # use default foo
myscript -bar=altBar -foo=altFoo

一个理想的解决方案是让我只列出我想要检查标志的变量。

有没有相当不错的方法来做到这一点?


我见过getopt,我认为它可能完成我正在寻找的 70% 的工作,但我想知道是否有一种工具或铟建立在它之上或类似的东西可以得到其余的。

【问题讨论】:

  • getopts 是迄今为止我发现的最好的。这有点特殊,但很适合我的需求。
  • 你检查stackoverflow.com/questions/402377/…了吗?看起来和你需要的很相似
  • @bobah:非常相关,实际上可能是我正在寻找的构建块,但我正在寻找更专业的东西。另外,我正在寻找一种剪切粘贴的解决方案,因为我现在所拥有的已经足够好了。
  • 确保您了解 Bash 内置 getopts(仅限短选项)和外部可执行文件 getopt(1)(长选项和短选项)之间的区别。 This page 建议避免使用后者。

标签: bash command-line-arguments


【解决方案1】:

你可以使用 eval 来做一些接近的事情:

foo=fooDefault
bar=barDefault

for arg in "$@"; do
    eval ${arg}
done

这个版本不需要前导破折号,所以你可以这样运行它:

myscript foo=newvalue

也就是说,请注意几句。因为我们使用的是 eval,所以调用者可以将他们想要的任何代码/数据注入到您的脚本中。如果您需要确保您的代码安全,则必须先验证${arg},然后再验证eval

此外,如果您需要在数据中包含空格,则这不是很优雅,因为您必须将它们双引号(一次用于命令行,第二次用于内部 eval):

myscript foo='"with sapces"'

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2021-12-03
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多