如何检查指定字符串是否存在于JSON数组中?
问题分析与修正方案
原脚本存在几个关键问题:
keys变量存储的是jq输出的JSON数组字符串(比如["domain","password",...]),并非Shell数组,直接遍历"${keys[@]}"只会把整个JSON字符串作为单个元素处理- 条件判断
[ "$key"== "$string" ]错误:key是Shell数组,不能直接与字符串比较;且==两侧必须加空格,否则会被解析为单个字符串 - 未正确完成JSON数组到Shell数组的转换
修正后的脚本
# 目标检查列表 target_keys=("domain" "password" "root" "url" "user") # 从Secret中提取data字段的键,转换为换行分隔的字符串,再转为Shell数组 mapfile -t secret_keys < <(kubectl get secret ssss --context rrrr -n test -o jsonpath='{$.data}' | jq -r '.[]') # 遍历目标键,检查是否存在于Secret的键列表中 for key in "${target_keys[@]}"; do if printf '%s\n' "${secret_keys[@]}" | grep -qxF "$key"; then echo "键 '$key' 存在于Secret中" else echo "键 '$key' 不存在于Secret中" fi done
关键说明
- JSON数组转Shell数组:用
jq -r '.[]'将JSON数组的每个元素按换行输出,再通过mapfile -t直接读取为Shell数组secret_keys,避免手动解析JSON字符串的麻烦 - 存在性检查:用
printf '%s\n' "${secret_keys[@]}"将数组元素逐行输出,配合grep -qxF精确匹配(-x整行匹配、-F固定字符串匹配、-q静默输出),高效判断键是否存在 - 变量命名优化:将原
ad改为target_keys,key改为secret_keys,语义更清晰
内容的提问来源于stack exchange,提问作者Paulo
相关产品推荐
相关产品推荐

