有没有办法在 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 中一起转义 $ 和单引号?的主要内容,如果未能解决你的问题,请参考以下文章