jq - 将 json 作为 bash 数组返回

get*_*ekv 5 bash jq

我的问题与这个问题类似,但我需要做更多的事情,但不太清楚该怎么做。

这是我的 JSON 字符串

{
  "value": "1"
}
{
  "value": "3"
}
{
  "value": "4"
}
Run Code Online (Sandbox Code Playgroud)

我需要在 BASH 中编写一个脚本来输出

  • 2 - 如果序列缺少数字
  • 5 - 如果序列没有缺少数字

在上面的示例中,json 数组中缺少 2。脚本应返回 2。如果数组中存在 2,则应返回 5。

我想我也许可以在 bash 中使用 while 循环编写逻辑来增加数字,但我陷入了困境,无法弄清楚如何仅使用该值将此 JSON 字符串转换为 bash 数组。

下面是我用来获取 JSON 输出的确切命令。这是 AWS CLI 命令,用于从 AWS 获取具有特定标签的所有实例。

readarray -t arr < <(aws ec2 describe-instances --region=us-east-1 --filters --filters "Name=tag:NodeType,Values=worker" --query "Reservations[].Instances[].Tags[]" | jq -r '.[] | select(.Key == "NodeNumber") | {value: .Value}')
printf '%s\n' "${arr[@]}"
Run Code Online (Sandbox Code Playgroud)

以上返回我

{
  "value": "1"
}
{
  "value": "3"
}
{
  "value": "4"
}
Run Code Online (Sandbox Code Playgroud)

但是,我需要将 VALUE 字段“value”作为 bash 数组获取

pea*_*eak 1

使用 jq 的“-s”命令行选项,以下内容满足我理解的要求,同时也概括了它们:

map(.value | tonumber)
| unique
| (1+max - min) as $length
| if $length > length then ([range(min;max+1)] - .)[]
  else max+1
  end
Run Code Online (Sandbox Code Playgroud)

如果您只想要最少的缺失值,请将“if”行上的“[]”替换为[0]