GitHub Actions中引用变量应何时使用单大括号与双大括号?
${变量名}单大括号格式:Shell运行时替换
这种写法完全属于Shell语法范畴,GitHub Actions引擎不会对这段内容做任何预处理,会直接把完整命令交给Runner的Shell进程执行。你在Workflow的env字段声明的变量会自动注入到所有Step的Shell运行环境中,所以示例中echo "${MY_VAR}"执行时,Shell会直接读取当前进程的环境变量MY_VAR完成替换输出。${{ 表达式 }}双大括号格式:GitHub Actions预处理替换
这种是GitHub Actions自定义的表达式语法,属于工作流引擎的预处理逻辑,优先级远高于Shell执行。在把run字段的命令传给Shell之前,GitHub会先解析双大括号内的上下文(比如env、github、secrets、needs等内置上下文),直接把表达式的结果替换到命令中。你示例中的echo "${{env.MY_VAR}}"在传给Shell前已经被处理成了echo "something",Shell只是执行了静态输出而已。
二者适用场景差异:
所有需要访问GitHub Actions内置上下文、任务输出、保密信息的场景,必须用双大括号,比如引用github.sha提交哈希、secrets.ACCESS_TOKEN保密配置、上游任务的输出needs.build-job.outputs.build-id,这些值不会默认注入到Shell环境变量中,必须通过预处理替换才能获取。
只需要访问你自己声明的env变量、Shell内置变量时,用单大括号更简洁,也能避免双大括号替换时特殊字符破坏Shell语法的问题。
你给出的示例中两个Step输出结果一致,但底层执行逻辑完全不同,实际使用时可以根据场景灵活选择。
内容的提问来源于stack exchange,提问作者Marcel Wilson

