本地正常运行的jq数组筛选器在GitHub工作流中失效,原因何在?
问题
在GitHub工作流中用jq提取JSON数组时触发语法错误,工作流配置如下:
name: Test on: workflow_dispatch: jobs: test: runs-on: ubuntu-latest steps: - name: Test run: echo $(echo '{"value":[{"displayName":"test"}]}' | jq -c '.value.[]')
运行时报错:
Run echo $(echo '{"value":[{"displayName":"test"}]}' | jq -c '.value.[]') jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1: .value.[] jq: 1 compile error
相同命令在本地Shell中能正常执行,为何在GitHub运行器里失效?
原因与解决方法
这是因为GitHub Actions的Shell环境会对未正确引用的方括号做路径扩展(尝试匹配当前目录下的文件),导致jq实际接收到的表达式不是.value.[],而是被Shell解析后的错误内容,最终触发语法错误。本地环境可能因为当前目录无匹配文件,或者Shell配置禁用了路径扩展,所以命令能正常运行。
修正方式有两种:
- 调整jq表达式并确保正确传递
把.value.[]简化为.value[],避免Shell对特殊字符的错误解析:- name: Test run: echo $(echo '{"value":[{"displayName":"test"}]}' | jq -c '.value[]') - 用多行命令拆分逻辑(更易维护)
把命令拆成多行,彻底规避嵌套引号和特殊字符解析问题:- name: Test run: | JSON_CONTENT='{"value":[{"displayName":"test"}]}' EXTRACTED=$(echo "$JSON_CONTENT" | jq -c '.value[]') echo "$EXTRACTED"
内容的提问来源于stack exchange,提问作者Weili Gao
相关产品推荐
相关产品推荐

