如何在 bash 中转义反引号

Pou*_*del 8 bash command-substitution

我很长时间以来都在试图逃避 bash 中的反引号。我尝试使用 \ 进行转义,但它不起作用。

bash 中是否可以逃避反引号?

示例代码

I="hello.pdf"

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

\`\`\`

EOL`

echo "$var1"

Run Code Online (Sandbox Code Playgroud)

所需输出

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

```
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 5

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

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

\`\`\`
EOL
)
echo "$var1"
Run Code Online (Sandbox Code Playgroud)

在https://ideone.com/nbOrIu查看此运行并发出所需的输出


否则,您需要更多反斜杠:

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

\\\`\\\`\\\`
EOL
`
echo "$var1"
Run Code Online (Sandbox Code Playgroud)

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


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

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

${fence}
EOL
)
echo "$var1"
Run Code Online (Sandbox Code Playgroud)

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