在使用"bash -c"运行时,保留Bash字符串中的双引号

3

我有一个存储为bash变量的

var="\"abc\""

因此,当我在本地打印这个变量时,它会给我正确的输出(带双引号)。
echo "$var"
"abc"

我想要做的是使用“bash -c”选项打印它。但是当我这样做时,它只打印值而没有双引号。
bash -c "echo \"$var\""
abc
bash -c "echo $var"
abc

有人能帮我解决一个问题吗?当我在“bash -c”中使用字符串时,如何保留双引号?而“-c”实际上是什么意思?


运行 bash --helpman bash 并阅读。同样适用于其他 Linux 命令。 - phuclv
基本上,在替换之后,您将执行以下代码:在第一个和第二个示例中分别为 bash -c "echo \""abc"\""bash -c "echo "abc"" - Aserre
3个回答

1

在这个语句中

bash -c "echo $var"

以下发生了以下事情:
(1) var 被扩展(结果为包括引号的"abc")。
(2) 一个 bash 子进程被调用,第一个参数为 -c,第二个参数为 echo "abc"
(3) 这个子进程运行命令,即 echo "abc",根据去除引号的规则,这等同于 echo abc,因此在输出中不会看到任何引号。
你可能会想要进行一些操作。
bash -c 'echo "$var"'

反之,此时会发生以下情况:

(1) 调用一个 bash 子进程,将 -c 作为第一个参数,echo "$var" 作为第二个参数。请注意,由于变量 $var 在单引号之间,因此尚未扩展。

(2) 此子进程运行命令,即 echo "$var"。然而,由于我们处于子进程中,变量 var 不存在,因此该命令相当于 echo "",即仅打印一个换行符。

但是您可以通过执行

export var
bash -c 'echo "$var"'

在这种情况下,var 变量将会被传递给你的脚本子进程,并且你将看到引号被打印出来。

1

来自 info bash

-c 如果使用 -c 选项,则命令将从第一个非选项参数 command_string 中读取。
如果在 command_string 后面有参数,则第一个参数将被分配给 $0, 并且任何剩余的参数都将被分配给位置参数。

因此,-c 选项会执行引号内的命令。

为了在通过 bash -c 调用时保留双引号,您需要单独引用变量。

$ bash -c "echo '"$var"'"
"abc"

0

在尝试保留命令中的引号时,这也可以不使用变量来完成:

bash -c "echo \\\"abc\\\""

在子shell中,\\ 被转换为 \\" 被转换为 "

echo \"abc\"

产生输出

"abc"

我需要在 Docker RUN directive 中进行引用转义,如下:
RUN "sed -i \"s/\\\"string-sourrounded-by-quotes\\\"/\\\"new-string\\\"/\" file"

因为它将在由SHELL指令定义的shell进程中运行。在我的情况下,SHELL directiveSHELL ["/bin/bash", "-o", "pipefail", "-c"],这导致了以下结果:

/bin/bash -o pipefail -c "sed -i \"s/\\\"quoted-string\\\"/new-string/\" file"

并且它被执行为

sed -i "s/\"quoted-string\"/new-string/" file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接