Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash:如何扭曲引号中的插值变量,将其(连同引号)作为参数传递给脚本中的另一个命令_Bash - Fatal编程技术网

bash:如何扭曲引号中的插值变量,将其(连同引号)作为参数传递给脚本中的另一个命令

bash:如何扭曲引号中的插值变量,将其(连同引号)作为参数传递给脚本中的另一个命令,bash,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 "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'\''' ...

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

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
在第二种情况下,双引号由shell解释(尽管它们不是必需的,因为参数不包含空格),而
docker
在这两种情况下看到的只是字符串
VAR=val

如果你尝试像

env="VAR=multiple words"
set +x
docker run -r "$env" some_image
+ docker run -r 'VAR=multiple words' some_image
docker
的第三个命令行参数将是充满空格的字符串
VAR=multiple words
,它通过
set-x
打印出来,如下所示

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



为了调试这些东西,可以使用
echo
替换实际的命令。这将打印命令看到的原始参数,而不添加任何引用。这样做的缺点是,您无法区分作为单个参数一部分的空格与参数之间的
echo
自动打印的空格之间的区别。

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
在第二种情况下,双引号由shell解释(尽管它们不是必需的,因为参数不包含空格),而
docker
在这两种情况下看到的只是字符串
VAR=val

如果你尝试像

env="VAR=multiple words"
set +x
docker run -r "$env" some_image
+ docker run -r 'VAR=multiple words' some_image
docker
的第三个命令行参数将是充满空格的字符串
VAR=multiple words
,它通过
set-x
打印出来,如下所示

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



为了调试这些东西,可以使用
echo
替换实际的命令。这将打印命令看到的原始参数,而不添加任何引用。这样做的缺点是,您无法区分作为单个参数一部分的空格与参数之间的
echo
自动打印的空格之间的区别。

shell会删除
“VAR=val”
周围的双引号<代码>docker run-e“$env”…应该可以工作。shell会删除
“VAR=val”
周围的双引号<代码>docker run-e“$env”…应该可以工作。