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”…应该可以工作。