
yq 如何用 -e 退出状态码在脚本中判断查询结果为空或 false【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yq写自动化脚本时经常要判断配置文件里某个字段是否存在、值是否为 false但 yq 查询不到内容时照样会打印null光看输出文本无法可靠分支。yq 为此提供了-e--exit-status标志当查询结果没有匹配、是 null、或返回 false时进程以非零退出码结束脚本就能用标准的if/$?机制直接判断。适用前提机器上已安装 yq目标文件是 yq 支持解析的格式未知扩展名默认按 YAML 处理见 README 中的 Usage 说明。先确认环境yq -V-V--version打印版本信息后退出README 的 Flags 列表中有此标志。如果命令不存在先安装 yqREADME 列出了多种方式例如 MacOS/Linux 上用 Homebrewbrew install yqLinux 上也可以用 snapsnap install yqREADME 还列出了从项目 Releases 下载预编译二进制、以及用 Docker/Podman 一次性运行docker run --rm -v ${PWD}:/workdir mikefarah/yq 表达式 文件等途径。本文场景是脚本中长期调用建议本地安装。-e 的具体判定规则README 中对该标志的描述是-e, --exit-status set exit status if there are no matches or null or false is returned即只有三种情况返回非零退出状态没有匹配、结果为null、结果为false。源码对这条规则的实现细节可以核对到三处触发位置eval默认命令执行完表达式后检查是否真的打印过内容没有则报错no matches found见 cmd/evaluate_sequence_command.goeval-all命令有同样的检查见 cmd/evaluate_all_command.go。打印过内容的判定结果节点不是!!null且不是!!bool的false才算打印过见 pkg/yqlib/printer.go。也就是说null和false不算其他值——包括0、空字符串——都算。退出码任何错误都让进程以 1 退出见 yq.go。一个容易被忽略的副作用-e不抑制 stdout。查询不存在的字段时null仍会正常打印到 stdout同时 stderr 输出no matches found退出码为 1。脚本里需要把取输出和看退出码分开处理。最小示例对文件字段做判断用仓库自带的 examples/small.yaml内容如下--- # comment # about things a: cat两个查询的退出码不同下面的输出与退出码为按上述规则得到的示例结果可在本地复现yq -e .a examples/small.yaml echo $? # 0.a 存在值是 cat属正常结果yq -e .missing examples/small.yaml echo $? # 1字段不存在结果为 null第二条命令的 stdout 打印null但退出码是 1stderr 含no matches found错误。在脚本中使用标准的分支写法if yq -e .a examples/small.yaml; then echo 字段 .a 存在且值不是 null/false else echo 字段 .a 不存在或值为 null/false fi如果还要取到值本身可以先捕获输出再看退出码value$(yq -e .a examples/small.yaml) if [ $? -eq 0 ]; then echo value: $value else echo no valid value fi命令替换的退出码就是 yq 的退出码$?紧跟在其后即可读取。用 null 输入验证四类结果README 中的-n--null-input表示不读输入文件、直接求值表达式可以不用建文件就核对每个边界示例结果yq -e -n false; echo $? # 输出 false退出码 1 yq -e -n null; echo $? # 输出 null 退出码 1 yq -e -n true; echo $? # 输出 true 退出码 0 yq -e -n 0; echo $? # 输出 0 退出码 0这四条正好覆盖-e的规则边界只有null与false被判为非零0是正常结果不会被误判为失败。多文档场景可选处理多文档 YAML 时用eval-allREADME 中的子命令一次加载所有文档再执行表达式。-e的检查在该路径同样生效见上文 cmd/evaluate_all_command.go 的引用表达式在所有文档中都没有匹配时退出码同样非零。限制不加-e时上面所有查询包括无匹配退出码都是 0非零检查只在开启该标志后执行cmd/evaluate_sequence_command.go 的条件里包含exitStatus。失败退出码固定为 1项目没有区分无匹配与其他错误的退出码yq.go 统一os.Exit(1)。如果脚本需要区分查不到值和文件解析失败只能进一步检查 stderr 里的错误消息。-e是定义在根命令上的持久标志cmd/root.go默认eval与eval-all均可用项目文档没有给出失败原因到退出码的映射表脚本中按非零即失败处理即可。需要更多标志如-n、-e、-o等的完整列表时见 README 的 Usage 一节。【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考