如何在 bash 中转义反引号

7

我长时间尝试在bash中转义反引号(backtick),但是使用\转义失败了。

有没有可能在bash中转义反引号?

示例代码

I="hello.pdf"

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

\`\`\`

EOL`

echo "$var1"

所需输出

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

```

5
可以使用 $(...) 替代反引号吗? - Robert
2
自从 POSIX.2 发布于 1992 年以来,$(...) 就一直是首选/现代语法;这已经接近30年了!在现代代码中使用反引号进行命令替换是没有任何借口的。 - Charles Duffy
相关:[BashFAQ#82](http://mywiki.wooledge.org/BashFAQ/082),[Shell编程中$(command)和\`command\`之间的区别是什么?](https://dev59.com/iG445IYBdhLWcg3wws4u) - Charles Duffy
1个回答

5

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

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"

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接