Bash中如何同时转义$与单引号避免变量被误解析?
解决方案
最稳妥的方式是将所有动态内容通过步骤的env块注入Shell环境,不要在run段的代码中直接使用${{ }}语法插入动态值,从根源上避免所有特殊字符($、单引号、双引号、反斜杠等)的解析问题。
GitHub Actions执行run段的脚本时,你在步骤env中定义的所有变量都会自动成为当前Shell的环境变量,直接读取即可,不需要做任何转义处理。
示例Workflow配置如下:
- name: 发送消息 env: REQ_URL: ${{ env.URL }} REQ_BODY: ${{ env.body }} REQ_TOKEN: ${{ secrets.TOKEN }} run: | printf -v markdown_message_unescaped %b "<$REQ_URL|*$REQ_BODY*>\n" jq -n -r --arg text "$markdown_message_unescaped" '{"text": $text}' | curl -X POST \ -H "Authorization: Bearer $REQ_TOKEN" \ -H "Content-Type: application/json" \ -d @- \ "$REQ_URL"
原方案问题说明
- 最初的代码直接把
${{ env.body }}插入双引号包裹的字符串中,Shell会把内容中的$识别为变量前缀尝试解析,导致内容被篡改。 - 后续修改的版本把
${{ env.body }}放到单引号里,虽然避免了$解析的问题,但只要env.body中出现单引号就会提前闭合字符串边界,触发Shell语法错误,同时还存在命令注入的安全隐患。
内容的提问来源于stack exchange,提问作者Natsuki Hoshii
相关产品推荐
相关产品推荐

