Bash循环遍历Key Vault Secret仅输出最后一项 如何获取全部匹配结果
问题根因
你的脚本存在3个核心问题,导致无法输出所有符合条件的Secret:
- 数组赋值方式错误:直接用
declare -a a1=$(命令)的写法,不会把命令的每行输出识别为数组元素,Bash默认会按空白字符分割输出内容,最终数组元素和你预期的Secret列表完全不匹配 - 输出格式选择错误:
-o table参数会输出表格表头、排版分隔符等冗余内容,仅适合人工查看,无法直接被脚本解析 - JMESPath查询字段不对:当前查询返回的是完整的Secret对象,不是你需要打印的Secret名称字段
修复后的完整脚本
VaultName="ketv1" # 按行读取命令输出到数组,查询时直接返回符合条件的Secret名称,用tsv格式输出无冗余内容 mapfile -t a1 < <(az keyvault secret list --vault-name "$VaultName" --query "[?attributes.expires<='2022-08-30'].name" -o tsv) for i in "${a1[@]}" do # 过滤可能存在的空行 if [ -n "$i" ]; then echo "$i" fi done
关键修改说明
- 用
mapfile -t命令将az cli的每行输出映射为数组的独立元素,避免内容分割错误 - 将输出格式从
table改为tsv,纯文本按行输出无多余排版内容,适合脚本解析 - 在JMESPath过滤条件后追加
.name,直接返回Secret名称字段,不需要额外处理整个对象结构 - 给变量引用加双引号,避免Vault名称等含特殊字符时出现执行错误
- 增加空行判断,避免输出无效空行
如果执行后发现时间匹配不符合预期,可以将查询条件中的截止时间补全为UTC完整时间格式,例如
[?attributes.expires<='2022-08-30T23:59:59Z']即可。
内容的提问来源于stack exchange,提问作者microset
相关产品推荐
相关产品推荐

