我从 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 但没有成功。
您可以使用 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: