String 如何将引用的参数传递给另一个程序
在bash脚本中,我需要将参数传递给另一个程序。参数中有空格,因此必须引用。在这种简单的情况下,一切正常1: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
/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[@]}"
虽然这确实回答了所问的问题,但它不能扩展到多个参数。尽管这确实回答了所问的问题,但它不能扩展到多个参数