在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"
这样的字符串,并能够将其完整地传递给另一个命令?
答案 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"