如何在Bash中判断指定值是否存在于YAML文件的对应数组字段中
实现方案
前置依赖
你需要提前安装yq(推荐mikefarah/yq v4及以上版本,目前主流Linux发行版可直接通过包管理器安装),处理HTTP路径时还需要系统自带的curl工具。
实现思路
- 先判断输入的YAML路径类型:如果是http/https开头的路径就用curl拉取内容,否则直接读取本地文件
- 用
yq提取thatyamlkey数组,判断是否包含目标值key2 - 根据判断结果走对应逻辑:存在就执行自定义操作,不存在返回
exit 1
可直接使用的脚本示例
#!/bin/bash # 配置变量,可根据实际需求修改 YAML_PATH="替换为你的yaml路径,支持本地路径或http/https链接" TARGET_KEY="key2" YQ_QUERY=".thatyamlkey[] | select(. == \"${TARGET_KEY}\")" # 第一步:获取YAML内容 if [[ $YAML_PATH =~ ^https?:// ]]; then # 处理远程HTTP路径 yaml_content=$(curl -s "${YAML_PATH}") if [ $? -ne 0 ]; then echo "拉取远程YAML文件失败" exit 1 fi else # 处理本地文件路径 if [ ! -f "${YAML_PATH}" ]; then echo "本地YAML文件不存在" exit 1 fi yaml_content=$(cat "${YAML_PATH}") fi # 第二步:判断数组是否包含目标值 match_count=$(echo "${yaml_content}" | yq eval "${YQ_QUERY}" | wc -l) if [ "${match_count}" -ge 1 ]; then echo "找到目标值${TARGET_KEY},执行指定操作" # 此处替换为你需要执行的自定义操作即可 else echo "未找到目标值${TARGET_KEY}" exit 1 fi
补充说明
- 如果你使用的是Python版本的yq,只需把脚本中的
yq eval改成yq -r即可,查询语法通用 - 上述脚本兼容数组存在重复值的场景,只要匹配到至少1个目标值就会走存在逻辑
内容的提问来源于stack exchange,提问作者Kamesh S S
相关产品推荐
相关产品推荐

