如何将引用的参数传递给另一个程序

时间:2015-09-15 10:15:34

标签: string bash parameters escaping quotes

在bash脚本中,我需要将参数传递给另一个程序。参数中有空格,因此必须引用。在这个简单的案例1中,一切正常:

/bin/echo /some/command --param="abc def ghi"

输出:

/some/command --param=abc def ghi

如果我想让bash脚本更复杂,问题就开始了,不知何故,参数值在第2和第3例中已经改变了:

FOO="ghi"
DEFAULTS="--param=\"abc def $FOO\""
/bin/echo /some/command $DEFAULTS

DEFAULTS='--param="abc def '$FOO'"'
/bin/echo /some/command $DEFAULTS

输出:

/some/command --param="abc def ghi"
/some/command --param="abc def ghi"

围绕abc def ghi的双引号显示在2和3中,而它们未显示为1。

通过让/ some /命令实际打印它作为第一个参数接收的内容,可以更好地说明这一点。这里收到整个字符串"abc def ghi"作为param参数的值:

perl -le'print $ARGV[0]' param="abc def ghi"

输出(右):

param=abc def ghi

但是这里只收到"abc,其中有一个引号:

DEFAULTS='param="abc def ghi"'
perl -le'print $ARGV[0]' $DEFAULTS

DEFAULTS="param=\"abc def ghi\""
perl -le'print $ARGV[0]' $DEFAULTS

输出(错误):

param="abc
param="abc

如何使用bash动态构建像param="abc def ghi"这样的字符串,并能够将其完整地传递给另一个命令?

2 个答案:

答案 0 :(得分:3)

使用数组;这就是他们被介绍的原因。

FOO="ghi"
# Contains one element, but not the literal quotes
DEFAULTS=(--param="abc def $FOO")
# command gets 1 argument, the single element of the array
/some/command "${DEFAULTS[@]}"

# Two elements
DEFAULTS=(--param="abc def $FOO" --other="foo bar")
# command gets 2 arguments
/some/command "${DEFAULTS[@]}"

答案 1 :(得分:2)

你快到了。你只需要将$DEFAULTS放入双引号中,这样bash就不会分词。

DEFAULTS='param="ac def ghi"'
perl -le'print $ARGV[0]' "$DEFAULTS"

输出:

param="ac def ghi"