将带有双引号和单引号的参数传递给 bash 中的另一个调用

将带有双引号和单引号的参数传递给 bash 中的另一个调用

我有一个电话

./run.sh name --vars="service_name='someothername'"

我试图用完全相同的--vars="service_name='someothername'"参数调用另一个程序run.sh,但是每当我这样做时,$2当我尝试这样做时,Bash 会在变量两边加上单引号

cmd=$(runother $2 | process output)

我得到其中之一

  • runother '"--vars=service_name='\''someother..
  • runother '--vars=service_name='\''someother
  • runother '--vars=service_name=someother'

我尝试在周围加上双引号$2,删除单引号,如在子bash中${2//\'}打印字符串。printf

UPD:显然程序考虑了./a --b=c./a '--b=c'类似的问题,所以这个问题没有意义,而且我在另一段代码中遇到了错误。

UPD2:正如 @choroba 在下面的评论中提到的:“set -x在输出中添加引号,以便您可以找到分词的工作原理,它们实际上并没有添加到字符串中, 尽管”

答案1

双引号$2(如果值所在的位置)是正确的做法。

如果您正在查看 的输出,set -x请注意 shell 很可能会在该输出中添加各种引用。这些额外的引号不是数据的一部分。

示例(中bash):

var=--vars="service_name='someothername'"
printf 'var has value %s\n' "$var"

这将输出

var has value --vars=service_name='someothername'

set -x输出将如下所示

$ set -x
$ var=--vars="service_name='someothername'"
+ var='--vars=service_name='\''someothername'\'''
$ printf 'var has value %s\n' "$var"
+ printf 'var has value %s\n' '--vars=service_name='\''someothername'\'''
var has value --vars=service_name='someothername'

pdkshOpenBSD 上:

$ set -x
$ var=--vars="service_name='someothername'"
+ var=--vars=service_name='someothername'
$ printf 'var has value %s\n' "$var"
+ printf var has value %s\n --vars=service_name='someothername'
var has value --vars=service_name='someothername'

zsh

$ set -x
$ var=--vars="service_name='someothername'"
+zsh:10> var='--vars=service_name='\''someothername'\'
$ printf 'var has value %s\n' "$var"
+zsh:11> printf 'var has value %s\n' '--vars=service_name='\''someothername'\'
var has value --vars=service_name='someothername'

不要担心调试输出中的额外引用。只需使用带有双引号的变量就可以了。

答案2

您应该尝试在带引号的参数前面放置 $ 符号,同时转义内部引号,如下所示:

./run.sh name $'--vars="service_name=\'\someothername\'"'

这应该可以工作,因为 $ 告诉 shell 将字符串的内容视为字符串,以便不解释它。并且必须对引号进行转义以避免被视为字符串的结束引号。

(也可以看看这个帖子

相关内容