Bash模式匹配逻辑运算未按预期运行,GitHub Actions脚本分支判断异常
问题根因
GitHub的${{ contains() }}表达式返回布尔值,渲染到Bash脚本时会输出小写的true或false字符串。而Bash的[[ ]]语法中,单独的非空字符串判断永远返回真值:
[[ true ]]返回0(逻辑真)[[ false ]]同样返回0(逻辑真),因为false是长度不为0的字符串,不会被识别为布尔假
只要你的all数组同时包含gcc和release,不管contains的结果是什么,第三个条件永远成立,自然会进入if分支。
修复方案
方案1:判断GitHub输出的字符串值
修改第三个条件,显式判断渲染后的字符串是否等于true:
if [[ " ${all[*]} " =~ " gcc " && \ " ${all[*]} " =~ " release " && \ "${{ contains(github.event.pull_request.body, '[GPU Compute Sanitizers]') }}" == "true" ]] then additional_opts="gpu-compute-sanitizers" else additional_opts= fi
方案2:利用Bash内置命令的返回值判断
把GitHub输出的布尔值移出[[ ]]块,直接作为Shell命令执行:Bash内置的true命令返回0(真),false命令返回1(假),正好可以作为逻辑判断依据:
if [[ " ${all[*]} " =~ " gcc " && \ " ${all[*]} " =~ " release " ]] && ${{ contains(github.event.pull_request.body, '[GPU Compute Sanitizers]') }} then additional_opts="gpu-compute-sanitizers" else additional_opts= fi
你可以在Actions脚本中增加一行打印验证替换结果,确认逻辑符合预期:
echo "Contains check result: ${{ contains(github.event.pull_request.body, '[GPU Compute Sanitizers]') }}"
内容的提问来源于stack exchange,提问作者Serge Rogatch
相关产品推荐
相关产品推荐

