我有一个存储为bash变量的
var="\"abc\""
因此,当我在本地打印这个变量时,它会给我正确的输出(带双引号)。
echo "$var"
"abc"
我想要做的是使用“bash -c”选项打印它。但是当我这样做时,它只打印值而没有双引号。
bash -c "echo \"$var\""
abc
bash -c "echo $var"
abc
有人能帮我解决一个问题吗?当我在“bash -c”中使用字符串时,如何保留双引号?而“-c”实际上是什么意思?
在这个语句中
bash -c "echo $var"
var
被扩展(结果为包括引号的"abc"
)。-c
,第二个参数为 echo "abc"
。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
变量将会被传递给你的脚本子进程,并且你将看到引号被打印出来。来自 info bash
-c 如果使用 -c 选项,则命令将从第一个非选项参数 command_string 中读取。
如果在 command_string 后面有参数,则第一个参数将被分配给 $0, 并且任何剩余的参数都将被分配给位置参数。
因此,-c
选项会执行引号内的命令。
为了在通过 bash -c
调用时保留双引号,您需要单独引用变量。
$ bash -c "echo '"$var"'"
"abc"
在尝试保留命令中的引号时,这也可以不使用变量来完成:
bash -c "echo \\\"abc\\\""
在子shell中,\\
被转换为 \
,\"
被转换为 "
。
echo \"abc\"
产生输出
"abc"
RUN "sed -i \"s/\\\"string-sourrounded-by-quotes\\\"/\\\"new-string\\\"/\" file"
因为它将在由SHELL指令定义的shell进程中运行。在我的情况下,SHELL directive是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
bash --help
或man bash
并阅读。同样适用于其他 Linux 命令。 - phuclvbash -c "echo \""abc"\""
和bash -c "echo "abc""
。 - Aserre