bash:如何对引号中的插值变量进行扭曲以将其(与引号一起)作为参数传递给脚本中的另一个命令

时间:2019-08-06 18:31:30

标签: bash

那么简单,但我完全被困住了。

我需要扭曲一些引号中的变量内容,并将其传递给带有这些引号的另一个命令。

所以我需要运行命令

docker run -e "VAR=val" ...

其中VAR=val是变量env的内容。所以我尝试

env="VAR=val"
set -x
docker run -e \"$env\" some_image

但是在插入bash时会在其周围加上另一个单引号!输出为:

docker run -e '"VAR=val"' ...

如何去除那些单引号?而且只留下双引号吗?

如果我这样做

docker run -e \'$env\' some_image

结果让我完全疯了

docker run -e ''\''VAR=val'\''' ...

我无法理解这里的逻辑,请帮忙!

1 个答案:

答案 0 :(得分:2)

docker二进制文件中看到的参数将仅包含双引号。

set -x机制仅将单引号添加为向您显示参数列表中的内容。


我怀疑您实际上并不希望docker看到任何的引号。在这种情况下,请不要在命令中转义它们

docker run -e "$env" some_image

该位置的双引号表示如果$env的值包含空格,它仍将作为参数(其中包含空格)传递给docker。 ,而不是被分成多个参数(这会造成混乱)。

这两个命令在新过程中将产生完全相同的参数数组:

docker run -e VAR=val some_image
docker run -e "VAR=val" some_image

在第二种情况下,双引号由外壳程序解释(尽管由于参数中不包含空格,所以双引号不是必需的),并且在两种情况下,docker看到的只是字符串{ {1}}。

如果您尝试类似的操作

VAR=val

env="VAR=multiple words" set +x docker run -r "$env" some_image 的第三个命令行参数将是空格字符串docker,由VAR=multiple words打印,类似于

set -x

因为在执行之前打印命令行之前的代码可以看到 not 引用该空格字符串会令人困惑。同样,+ docker run -r 'VAR=multiple words' some_image 命令在此调用中根本看不到任何引号。


对于调试这些事情,替换以docker开始的实际命令可能很有用。这将打印命令看到的原始参数,而不会添加任何引号。这样做的缺点是,您将无法分辨单个参数的一部分echo自身打印的空格 between < / em>参数。