![将带有双引号和单引号的参数传递给 bash 中的另一个调用](https://linux22.com/image/137105/%E5%B0%86%E5%B8%A6%E6%9C%89%E5%8F%8C%E5%BC%95%E5%8F%B7%E5%92%8C%E5%8D%95%E5%BC%95%E5%8F%B7%E7%9A%84%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92%E7%BB%99%20bash%20%E4%B8%AD%E7%9A%84%E5%8F%A6%E4%B8%80%E4%B8%AA%E8%B0%83%E7%94%A8.png)
我有一个电话
./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'
在pdksh
OpenBSD 上:
$ 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 将字符串的内容视为字符串,以便不解释它。并且必须对引号进行转义以避免被视为字符串的结束引号。
(也可以看看这个帖子)