我有一个bash变量,它被存储为
var="\"abc\""
所以,当我在本地打印这个变量时,它会给出正确的输出(带双引号)
echo "$var" "abc"
什么,我想做的是打印它使用'bash -c'选项..但是当我做同样的事情时,它只打印不带双引号的值。
bash -c "echo \"$var\"" abc bash -c "echo $var" abc
有人能帮我在bash -c中使用双引号时,如何保留字符串中的双引号吗?-c实际上是什么意思?
1cklez4t1#
在声明中
bash -c "echo $var"
发生以下情况:(1)var被展开(结果是包含引号的"abc")。(2)调用bash子进程,接收第一个参数-c和第二个参数echo "abc"(3)该子进程运行命令,即echo "abc",根据引号删除规则,这相当于echo abc,并且在输出中看不到任何引号。你可能会想做一个
var
"abc"
-c
echo "abc"
echo abc
bash -c 'echo "$var"'
在这种情况下,会发生以下情况:(1)调用bash子进程,接收第一个参数-c和第二个参数echo "$var"。请注意,$var尚未展开,因为它位于单引号之间。(2)该子进程运行命令,即echo "$var"。但是,由于我们处于子进程中,因此变量var不存在,并且命令等效于echo "",即仅打印换行符。但是,您可以合并执行
echo "$var"
$var
echo ""
export var bash -c 'echo "$var"'
在本例中,var可用于脚本的子进程,您将看到打印的引号。
mznpcxlj2#
从info bash-c如果存在-c选项,则从第一个非选项参数command_string读取命令。如果command_string后面有参数,则第一个参数被分配给$0,其余参数被分配给位置参数。因此,-c选项执行引号内的命令。要在通过bash -c调用时保留双引号,您需要单独引用变量。
info bash
bash -c
$ bash -c "echo '"$var"'" "abc"
68bkxrlz3#
当试图在命令中保留引号时,也可以在没有变量的情况下完成:
bash -c "echo \\\"abc\\\""
因此,在子shell中,\\减少到\,\"减少到",这构成了
\\
\
\"
"
echo \"abc\"
产生输出
我需要在docker RUN指令中使用引号转义,如
RUN "sed -i \"s/\\\"string-sourrounded-by-quotes\\\"/\\\"new-string\\\"/\" file"
因为它将在由SHELL指令定义的shell进程中运行。在我的例子中,SHELL指令是SHELL ["/bin/bash", "-o", "pipefail", "-c"],结果是:
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
3条答案
按热度按时间1cklez4t1#
在声明中
发生以下情况:
(1)
var
被展开(结果是包含引号的"abc"
)。(2)调用bash子进程,接收第一个参数
-c
和第二个参数echo "abc"
(3)该子进程运行命令,即
echo "abc"
,根据引号删除规则,这相当于echo abc
,并且在输出中看不到任何引号。你可能会想做一个
在这种情况下,会发生以下情况:
(1)调用bash子进程,接收第一个参数
-c
和第二个参数echo "$var"
。请注意,$var
尚未展开,因为它位于单引号之间。(2)该子进程运行命令,即
echo "$var"
。但是,由于我们处于子进程中,因此变量var
不存在,并且命令等效于echo ""
,即仅打印换行符。但是,您可以合并执行
在本例中,
var
可用于脚本的子进程,您将看到打印的引号。mznpcxlj2#
从
info bash
-c如果存在-c选项,则从第一个非选项参数command_string读取命令。
如果command_string后面有参数,则第一个参数被分配给$0,其余参数被分配给位置参数。
因此,
-c
选项执行引号内的命令。要在通过
bash -c
调用时保留双引号,您需要单独引用变量。68bkxrlz3#
当试图在命令中保留引号时,也可以在没有变量的情况下完成:
因此,在子shell中,
\\
减少到\
,\"
减少到"
,这构成了产生输出
我需要在docker RUN指令中使用引号转义,如
因为它将在由SHELL指令定义的shell进程中运行。在我的例子中,SHELL指令是
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
,结果是:并执行为