【问题标题】:Bash command line parsing containing whitespace包含空格的 Bash 命令行解析
【发布时间】:2015-03-04 22:17:29
【问题描述】:

我在 shell 脚本中解析了一个命令行参数,如下所示:

cmd --a=hello world good bye --b=this is bash script

我需要解析“a”的参数,即“hello world ...”,它们由空格分隔成一个数组。

即 a_input() 数组应包含“hello”、“world”、“good”和“bye”。

同样适用于“b”参数。

我试过如下:

--a=*)
      a_input={1:4}
      a_input=$@
for var in $a_input
    #keep parsing until next --b or other argument is seen
done

但是上面的方法很粗糙。任何其他解决方法。我不能使用 getopts。

【问题讨论】:

标签: bash shell unix scripting scripting-language


【解决方案1】:

最简单的解决方案是让您的用户首先正确引用参数。

除非你可以手动循环直到你到达参数的末尾或点击下一个--argument(但这意味着你不能在你的参数值中包含以--开头的单词......除非您还可以对那些限制稍少的-- 字词进行有效选项测试。

【讨论】:

    【解决方案2】:

    添加到 Etan Reisners 的答案,这是绝对正确的:

    我个人觉得 bash 有点麻烦,当数组/字符串处理变得更加复杂时,如果你真的有奇怪的要求,调用者不应该被要求使用引号,我会在这里写一个中间脚本,比如说、Ruby 或 Perl,它们只是以适当的方式收集参数,在它们周围加上引号,然后将它们传递给原本应该被调用的脚本——即使这需要额外的过程。

    例如,Ruby One-Liner 之类的

    system("your_bash_script here.sh '".(ARGV.join(' ').split(' --').select {|s| s.size>0 }.join("' '"))."'")
    

    会进行此清理,然后调用您的脚本。

    【讨论】:

    • 这实际上只是手动循环(自动完成),这会丢失内部--
    • 你是对的 - 我忘了把破折号放回去(虽然这很容易添加)。当然它在内部是一个循环,但从程序员的角度来看,你作为一个整体“充当一个数组”,IMO 使它更容易理解(尽管这是一个品味问题)。然而,我的主要观点是:您需要在程序中投入的智能越多,bash 就越不适合作为通用编程语言,因此可能值得寻找替代方案。
    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 2019-04-05
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多