有没有办法在 bash 中一起转义 $ 和单引号?

Posted

技术标签:

【中文标题】有没有办法在 bash 中一起转义 $ 和单引号?【英文标题】:Is there a way to escape $ and single quotes together in bash? 【发布时间】:2021-12-27 03:46:40 【问题描述】:

我正在运行下面的代码,但是如果env.body包含$,它将被翻译为变量。

printf -v markdown_message_unescaped %b "<$ env.URL |*$ env.body *>\n"
jq -n -r --arg text "$markdown_message_unescaped" '"text": $text'|curl -X POST -H 'Authorization: Bearer $ secrets.TOKEN ' -H "Content-Type: application/json" -d @-  $ env.URL 
 

我将代码修改为如下所示以转义$,但如果env.body 中包含单引号,这将无法正常工作。

body='$ env.body '
printf -v markdown_message_unescaped %b "<$ env.URL |*$body*>\n"
jq -n -r --arg text "$markdown_message_unescaped" '"text": $text'|curl -X POST -H 'Authorization: Bearer $ secrets.TOKEN ' -H "Content-Type: application/json" -d @-  $ env.URL 

有没有办法解决这个问题?

【问题讨论】:

【参考方案1】:

您可以使用heredoc,它将按字面意思保留所有内容(选择的EOF 字符串除外)。您必须使用 yaml 管道运算符来保留新行,因为它们是 heredoc 语法所必需的。

run: |
  markdown_msg=$(
  cat <<"EOF"
  $ env.body 
  EOF
  )
  printf -v markdown_msg %b "$markdown_msg"
  jq --arg text "$markdown_msg" # etc

重要的是 bash 在一行中看到 EOF,没有前导或尾随空格。 yaml 文件中的缩进将在传递给 bash 之前被去除。

【讨论】:

即使我用heredoc,如果env.body里面有$,也会被识别为变量。 @NatsukiHoshii 使用(引用)"EOF" 的外壳不会扩展任何内容。包括$。是这个意思吗? 成功了。我忘了加双引号。谢谢!

以上是关于有没有办法在 bash 中一起转义 $ 和单引号?的主要内容,如果未能解决你的问题,请参考以下文章

在 Xpath 中同时转义双引号和单引号

Javascript - 如何在 Kendo 模板上转义双引号和单引号

在mysql中插入时保留双引号和单引号以及转义字符

Ansible 转义双引号和单引号

在 Bash 中的命令中扩展单引号内的变量

在 Bash 中的命令中扩展单引号内的变量