Bash中迭代jq输出的JSON数组失败,问题出在哪?
问题分析与解决方案
错误原因
你当前的赋值方式只是把jq输出的整个JSON字符串赋值给了secret_list变量,它本质是一个普通字符串,并非Bash数组。所以在后续操作中,${#secrets_list[@]}会把整个字符串当作数组的唯一元素,遍历也只会输出完整的JSON字符串。
解决方案
以下是几种可行的正确实现方式:
方法1:直接生成Bash数组格式赋值
利用jq的@sh过滤器将每个元素转换为符合Bash语法的安全字符串,再将结果转为数组:
# 正确赋值为Bash数组 secret_list=($(mycli | jq -r '.[] | @sh')) # 验证并遍历 echo "secrets_list: ${secret_list[@]}" echo "Number of secrets ${#secret_list[@]}" for secret in "${secret_list[@]}" do echo "$secret" # 在这里执行你的目标CLI命令,例如: # your_command "$secret" done
jq -r '.[] | @sh':将JSON数组的每个元素转为带引号的安全格式,避免特殊字符解析错误;-r输出原始字符串而非JSON转义格式。()包裹结果:让Bash将输出解析为数组元素。
方法2:用readarray读取(Bash 4.0+适用)
如果你的Bash版本在4.0及以上,可使用readarray直接将jq输出的每行元素存入数组:
# 读取每行元素到数组,-t 移除换行符 readarray -t secret_list < <(mycli | jq -r '.[]') # 遍历数组 for secret in "${secret_list[@]}" do echo "$secret" done
< <(...):进程替换,将jq的输出作为readarray的输入源。
方法3:逐行读取处理(兼容低版本Bash)
无需数组,直接通过while循环逐行处理每个元素,兼容性最好:
# 直接遍历jq输出的每行元素 mycli | jq -r '.[]' | while read -r secret do echo "$secret" # 执行你的CLI命令 # your_command "$secret" done
read -r:避免反斜杠被解析为转义字符,保证元素内容完整。
内容的提问来源于stack exchange,提问作者DevOpsWorld
相关产品推荐
相关产品推荐

