如何在 bash 中转义反引号

How to escape backticks in bash

我很长时间都在尝试避开 bash 中的反引号。 我尝试用 \ 转义,但它不起作用。

是否可以在 bash 中转义反引号?

示例代码

I="hello.pdf"

var1=`cat <<EOL
![](../images/${I%.*}.png)
\`\`\`sql
some code here

\`\`\`

EOL`

echo "$var1"

需要输出

![](../images/hello.png)
```sql
some code here

```

使用 $(...) 而不是外层命令替换的反引号语法。因此:

I='foo.png'
var1=$(cat <<EOL
![](../images/${I%.*}.png)
\`\`\`sql
some code here

\`\`\`
EOL
)
echo "$var1"

查看此 运行,并在 https://ideone.com/nbOrIu

发出您想要的输出

否则,你需要更多个反斜杠:

I='foo.png'
var1=`cat <<EOL
![](../images/${I%.*}.png)
\\`\\`\\`sql
some code here

\\`\\`\\`
EOL
`
echo "$var1"

...如果您要将反引号嵌套在反引号内,则需要再次乘以反斜杠。对基于反引号的命令替换说不。


顺便说一下,您可能会考虑完全避免这个问题:

I='foo.png'
fence='```'
var1=$(cat <<EOL
![](../images/${I%.*}.png)
${fence}sql
some code here

${fence}
EOL
)
echo "$var1"

...将文字反引号放在变量中意味着您不再需要任何类型的转义来防止它们被视为语法。