将 JSON 数组组织到菜单中

问题描述 投票:0回答:1

我从 API 获得了这些数据:

[{"name":"***.com","id":"***-0a5864441f49","type":"NATIVE"},{"name":"***.de","id":"***-0a5864441f49","type":"NATIVE"},{"name":"***.com","id":"***-0a5864440f67","type":"NATIVE"},{"name":"***.de","id":"***-0a5864441314","type":"NATIVE"},{"name":"***.com","id":"***-0a586444968b","type":"NATIVE"},{"name":"***.de","id":"***-0a5864441314","type":"NATIVE"},{"name":"***.de","id":"***-0a5864441f49","type":"NATIVE"},{"name":"***.de","id":"***-0a5864441f49","type":"NATIVE"},{"name":"***.de","id":"***-0a58644406ac","type":"NATIVE"},{"name":"***.de","id":"***-0a58644435f4","type":"NATIVE"}]

我想从中创建一个菜单,如下所示:

Choose one:
1. ***.com ***-0a5864441f49
2. ***.de ***-0a5864441f49
and so on...

然后我想进一步使用输入。在 bash 中执行此操作最有效的方法是什么?

我正在考虑一个数组,但我认为 IFS 不喜欢我使用

},{
作为分隔符,对吗?

我尝试使用 IFS 但没有成功。

arrays json string bash menu
1个回答
1
投票

您可以使用 jq 将输入转换为如下所示(请参阅playground):

$ jq -r 'map("\(.name) \(.id)")[]' infile.json
***.com ***-0a5864441f49
***.de ***-0a5864441f49
***.com ***-0a5864440f67
***.de ***-0a5864441314
-->8--

基于此,您可以将此输出读入数组,然后使用

select
内置函数来呈现菜单:

readarray -t opts < <(jq -r 'map("\(.name) \(.id)")[]' infile.json)

PS3='Choose one: '
select opt in "${opts[@]}"; do
    echo "Do something with $opt"
    break
done

导致类似的提示

1) ***.com ***-0a5864441f49    6) ***.de ***-0a5864441314
2) ***.de ***-0a5864441f49     7) ***.de ***-0a5864441f49
3) ***.com ***-0a5864440f67    8) ***.de ***-0a5864441f49
4) ***.de ***-0a5864441314     9) ***.de ***-0a58644406ac
5) ***.com ***-0a586444968b   10) ***.de ***-0a58644435f4
Choose one: 
© www.soinside.com 2019 - 2024. All rights reserved.