shell 当使用“bash -c”运行时,保留bash字符串中的双引号

wqlqzqxt  于 2023-05-07  发布在  Shell
关注(0)|答案(3)|浏览(269)

我有一个bash变量,它被存储为

var="\"abc\""

所以,当我在本地打印这个变量时,它会给出正确的输出(带双引号)

echo "$var"
"abc"

什么,我想做的是打印它使用'bash -c'选项..但是当我做同样的事情时,它只打印不带双引号的值。

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

有人能帮我在bash -c中使用双引号时,如何保留字符串中的双引号吗?-c实际上是什么意思?

1cklez4t

1cklez4t1#

在声明中

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可用于脚本的子进程,您将看到打印的引号。

mznpcxlj

mznpcxlj2#

info bash
-c如果存在-c选项,则从第一个非选项参数command_string读取命令。
如果command_string后面有参数,则第一个参数被分配给$0,其余参数被分配给位置参数。
因此,-c选项执行引号内的命令。
要在通过bash -c调用时保留双引号,您需要单独引用变量。

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

68bkxrlz3#

当试图在命令中保留引号时,也可以在没有变量的情况下完成:

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

因此,在子shell中,\\减少到\\"减少到",这构成了

echo \"abc\"

产生输出

"abc"

我需要在docker RUN指令中使用引号转义,如

RUN "sed -i \"s/\\\"string-sourrounded-by-quotes\\\"/\\\"new-string\\\"/\" file"

因为它将在由SHELL指令定义的shell进程中运行。在我的例子中,SHELL指令是SHELL ["/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

相关问题