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

String 如何将引用的参数传递给另一个程序,string,bash,parameters,escaping,quotes,String,Bash,Parameters,Escaping,Quotes,在bash脚本中,我需要将参数传递给另一个程序。参数中有空格,因此必须引用。在这种简单的情况下,一切正常1: /bin/echo /some/command --param="abc def ghi" 输出: param="ac def ghi" 如果我想使bash脚本更复杂,那么问题就开始了,在案例2和案例3中,参数值发生了变化: FOO="ghi" DEFAULTS="--param=\"abc def $FOO\"" /bin/echo /some/command $DEFAULTS

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

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

param="ac 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
输出:

param="ac def ghi"
2和3中显示了围绕abc def ghi的双引号,而1中没有显示

让/some/command实际打印它作为第一个参数接收到的内容可以更好地说明这一点。此处,整个字符串“abc def ghi”作为
param
参数的值接收:

perl -le'print $ARGV[0]' 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
输出(错误):


如何使用bash动态构造一个字符串,如
param=“abc def ghi”
,并能够将其完整地传递给另一个命令?

您就快到了。您只需将
$DEFAULTS
放在双引号中,这样bash就不会进行分词了

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

param="ac def ghi"

您就快到了。您只需将
$DEFAULTS
放在双引号中,这样bash就不会进行单词拆分

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

param="ac def ghi"

使用数组;这就是引入它们的原因

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[@]}"

使用数组;这就是引入它们的原因

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[@]}"

虽然这确实回答了所问的问题,但它不能扩展到多个参数。尽管这确实回答了所问的问题,但它不能扩展到多个参数