【问题标题】:Is there a way to escape $ and single quotes together in bash?有没有办法在 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 }}

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

【问题讨论】:

    标签: bash github-actions


    【解决方案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" 的外壳不会扩展任何内容。包括$。是这个意思吗?
    • 成功了。我忘了加双引号。谢谢!
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多