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

Bash 如何避免在双引号中包含空格的变量中拆分参数?,bash,Bash,如何取而代之的是[“A=12”,“B=3”] 我知道: $ foo='A="1 2" B=3' sh -c 'ruby -e "p ARGV" $foo' ["A=\"1", "2\"", "B=3"] 但是需要变量foo,因为我真正的问题是Jenkins作业中的“shell执行过程” 编辑:在同一shell中使用数组 sh -c 'ruby -e "p ARGV" A="1 2" B=3' ["A=1 2", "B=3"] 但是,数组不能作为环境变量传播 $ foo=(A="1 2" B=

如何取而代之的是
[“A=12”,“B=3”]

我知道:

$ foo='A="1 2" B=3' sh -c 'ruby -e "p ARGV" $foo'
["A=\"1", "2\"", "B=3"]
但是需要变量
foo
,因为我真正的问题是Jenkins作业中的“shell执行过程”

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

sh -c 'ruby -e "p ARGV" A="1 2" B=3'
["A=1 2", "B=3"]
但是,数组不能作为环境变量传播

$ 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'
[]

这基本上是“不要那样做”问题的变体

你需要逃离空间,以弥合因缺乏恰当引用而造成的鸿沟

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

这基本上是“不要那样做”问题的变体

我的理解是,您希望向ruby发送两个附加参数(
A=12
B=3
),但在单个变量(
foo
)中。这并不简单,因为第一个参数中的空格将被子shell用于分词。一个解决方案是告诉子shell使用另一个字符进行分词(我使用的是
\uu
下面的代码)。因此,您的脚本变成:

$ sh -c $'python3 -c \'import sys; print("\\n".join(sys.argv[1:]))\' "$@"' _ 'A=1 2' B=3
A=1 2
B=3
如果您想在参数中保留
\uuu
作为一个可能的字符,您可以使用换行符进行分词,但它的可读性会降低:

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

我的理解是,您希望向ruby发送两个附加参数(
A=12
B=3
),但在单个变量(
foo
)中。这并不简单,因为第一个参数中的空格将被子shell用于分词。一个解决方案是告诉子shell使用另一个字符进行分词(我使用的是
\uu
下面的代码)。因此,您的脚本变成:

$ sh -c $'python3 -c \'import sys; print("\\n".join(sys.argv[1:]))\' "$@"' _ 'A=1 2' B=3
A=1 2
B=3
如果您想在参数中保留
\uuu
作为一个可能的字符,您可以使用换行符进行分词,但它的可读性会降低:

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

正如我在回答问题时的评论中所提到的,程序会在
make
时获取这些参数(a和B)。因此,我决定在一个菜谱中展开
$(foo)
,并调用submake。因为
make
按原样展开变量

之前:

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

$ foo='A="1 2" B=3' sh -c 'make $foo'
生成文件:

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

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

正如我在回答问题的评论中提到的,程序采用的参数(a和B)是
make
。因此,我决定在一个菜谱中展开
$(foo)
,并调用submake。因为
make
按原样展开变量

之前:

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

$ foo='A="1 2" B=3' sh -c 'make $foo'
生成文件:

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

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

我们和詹金斯有着同样的问题。即

./ourScript.py“${args}”

尽管有引用,args还是在空格上被打断了

我们把它用螺丝钉固定住了


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

我们在Jenkins身上遇到了这个问题。即

./ourScript.py“${args}”

尽管有引用,args还是在空格上被打断了

我们把它用螺丝钉固定住了


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

谢谢你的回答和到BashFAQ的链接,但是代码给了我
[“A=\\“1\\”,“2\\”,“B=3”]
谢谢你的回答和到BashFAQ的链接,但是代码给了我
[“A=\\\\“1\\”,“2\\”,“B=3”]
在我的实际情况下,程序接受这些参数是
make
。我用
ruby
一行描述了这个问题。所以,argv或env变量都可以。无论如何,我不明白你在回答中的意图。环境变量
foo
包含参数
A=“1 2”B=3
作为字符串,没有
A=1 2
B=3
作为单独的参数或环境变量。我希望我理解你的意图。在我的实际情况中,程序采用的参数是
make
。我用
ruby
一行描述了这个问题。所以,argv或env变量都可以。无论如何,我不明白你在回答中的意图。环境变量
foo
包含参数
A=“1 2”B=3
作为字符串,没有
A=1 2
B=3
作为单独的参数或环境变量。我希望我理解你的意图。谢谢你让我知道神奇变量
IFS
。但是,在我的例子中,
foo
是由另一个系统给出的。因此,更改分隔符不合适。您所说的“由另一个系统给定”是什么意思?如果你不控制foo,也许你可以从foo创建一个foo1,并且仍然使用IFS技巧。谢谢你让我知道了神奇的变量
IFS
。但是,在我的例子中,
foo
是由另一个系统给出的。因此,更改分隔符不合适。您所说的“由另一个系统给定”是什么意思?如果您不控制foo,也许您可以从foo创建foo1,并且仍然使用IFS技巧。