Bash对比远端JSON与本地YML,按差异对应ID动态执行删除操作
实现方案
核心逻辑
你已经拿到了接口存在但本地不存在的差异name列表,接下来只需要缓存远程接口的完整响应,遍历差异列表匹配对应id执行删除即可,避免重复发起GET请求。
完整可运行代码
declare -a arr=(_a _b _c) # 解析本地yml获取名称列表 ar=$(grep name files.yml | cut -d '"' -f2 | tr "\n" " ") fileItemArray=($ar) ARR_PRE=("${fileItemArray[@]/#/V1_}") for i in "${arr[@]}"; do local_var+=("${ARR_PRE[@]/%/$i}"); done # 缓存远程接口完整响应,避免重复请求 remote_data=$(curl -sX GET "你的GET接口地址XXXX") # 提取远程所有name remote_var=$(echo "$remote_data" | jq -r '.[].name') # 计算差异:仅远程存在的name diff_=$(echo -e "${local_var[@]// /\\n}\n${remote_var// /\\n}" | sort | uniq -u) # 遍历差异项执行删除 if [ -n "$diff_" ]; then for del_name in $diff_; do # 匹配差异name对应的id del_id=$(echo "$remote_data" | jq -r --arg name "$del_name" '.[] | select(.name == $name) .id') if [ -n "$del_id" ] && [ "$del_id" != "null" ]; then echo "正在删除条目: $del_name, id: $del_id" # 替换为你的实际DELETE接口地址,一般是接口路径拼接id curl -X DELETE "你的DELETE接口地址XXXX/$del_id" fi done else echo "无差异条目,无需删除" fi
注意事项
- 正式执行前可以先注释掉
curl -X DELETE行,先运行脚本打印要删除的name和id,确认匹配逻辑无误后再打开删除逻辑,避免误删数据 - 如果本地
files.yml结构后续会调整,建议用专门的yaml解析工具yq替代grep切割,解析逻辑更稳定,比如用yq e '.instance[] | .name' files.yml就能直接提取所有name值
内容的提问来源于stack exchange,提问作者ezceeaaaa
相关产品推荐
相关产品推荐

