如何避免在包含双引号空格的变量中拆分参数?

时间:2012-12-26 08:47:48

标签: bash

$ foo='A="1 2" B=3' sh -c 'ruby -e "p ARGV" $foo'
["A=\"1", "2\"", "B=3"]

如何获得["A=1 2", "B=3"]

我知道:

sh -c 'ruby -e "p ARGV" A="1 2" B=3'
["A=1 2", "B=3"]

但是变量foo是必需的,因为我的真正问题在于" shell执行过程"詹金斯的工作。

编辑:在同一个shell中使用数组

$ foo=(A="1 2" B=3) && ruby -e "p ARGV" $foo
["A=1 2", "B=3"]

但是,数组不能作为环境变量传播......

$ foo=(A="1 2" B=3) sh -c 'ruby -e "p ARGV" $foo'
[]

5 个答案:

答案 0 :(得分:3)

你需要逃离这个空间来弥补因缺乏适当引用而造成的鸿沟。

foo='A="1\ 2" B=3' sh -c 'ruby -e "p ARGV" $foo'

这基本上是“不要那样做”问题的变体。 http://mywiki.wooledge.org/BashFAQ/050

答案 1 :(得分:2)

我们与詹金斯有这个确切的问题。即

./ ourScript.py“$ {args}”

尽管有引号,

还是在空间上打破了。

我们用

修复了它

eval“./ ourScript.py'$ {args}'”

答案 2 :(得分:1)

我的理解是你要向ruby(A=1 2B=3)发送2个附加参数,但是在单个变量(foo)内。这并不简单,因为第一个参数中的空格将用于子shell的分词。一个解决方案是告诉子shell使用另一个字符进行分词(我正在使用_下方)。所以你的脚本变成了:

foo="A=1 2_B=3" sh -c 'IFS=_; ruby -e "p ARGV" $foo'

如果您希望将_作为参数中的可能字符,则可以使用换行符进行分词,但它的可读性会降低:

foo="A=1 2
B=3" sh -c 'IFS="
"; ruby -e "p ARGV" $foo'

答案 3 :(得分:0)

sh -s 'A=1 2' B=3 <<\EOF
export "$@"
python3 -c 'import os; print("\n".join(os.environ[x] for x in ["A", "B"]))' "$foo"
EOF

这要求您的/bin/sh支持未发布的POSIX-2008 TC1指定的export的声明命令行为。

转换为红宝石,因为我不使用它。

编辑这没有意义......你想要argv还是环境?您无法通过环境传递数组,也无法通过argv传递命名变量。

对于argv,请勿尝试使用变量。将字符串作为参数传递给shell包装器。

$ sh -c $'python3 -c \'import sys; print("\\n".join(sys.argv[1:]))\' "$@"' _ 'A=1 2' B=3
A=1 2
B=3

答案 4 :(得分:0)

正如我在问题答案中的评论中所提到的,该程序将这些参数(A和B)设为make。所以,我决定在配方中扩展$(foo)并调用submake。因为make按原样扩展变量。

在:

$ foo='A="1 2" B=3' sh -c 'make $foo'

在:

$ foo='A="1 2" B=3' sh -c 'make wrapper'

生成文件:

wrapper:
    make $(foo)

这不是我问题的确切答案,而是我选择的解决方案。