那么简单,但我完全被困住了。
我需要扭曲一些引号中的变量内容,并将其传递给带有这些引号的另一个命令。
所以我需要运行命令
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'\''' ...
我无法理解这里的逻辑,请帮忙!
答案 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>参数。