我正在尝试使用bash中的select函数创建一个菜单。我正在访问一个API,它将以json格式返回其输出。然后,我将处理API返回到select语句的内容,然后用户可以与之交互。
这是API调用以及我如何解析输出:
curl -H "Authorization:Bearer $ACCESS_TOKEN" https://api.runscope.com/buckets \
| python -mjson.tool > output.json
这将通过python的json解析工具发送curl的输出,最后发送到output.json文件。
然后我使用这个json blob创建一个数组。我必须将IFS设置为\ n才能正确解析文件:
IFS=$'\n'
BUCKETS=("$(jq '.data | .[].name' output.json)")
然后我向数组添加一个退出选项,以便用户可以退出选择菜单:
BUCKETS+=("Exit")
最后,我创建菜单:
select BUCKET in $BUCKETS;
do
case $BUCKET in
"Exit")
echo "Exiting..."
break;;
esac
echo "You picked: $BUCKET"
done
不幸的是,这不会创建退出选项。我能看到一个包含我想要的其他选项的菜单,除了退出选项。菜单和数组中的每个选项都有引号。如何显示“退出”选项?
答案 0 :(得分:0)
而不是
jq '.data | .[].name' output.json
试
jq -r '.data | .[].name' output.json
(-r
:没有引号的原始数据)
最重要的部分:
select BUCKET in "${BUCKETS[@]}"
^^^
ARRAY syntax
答案 1 :(得分:0)
$BUCKETS
正在扩展到BUCKETS
数组的第一个元素。
然后将其分词并用作您的选择条目。
这是有道理的,因为你将jq
子shell包装在双引号中,这阻止了在那里发生分词(并且意味着IFS
更改不做任何我认为的事情。)
Iff 您的条目可以包含空格和您想要正确分配给数组的方法,方法是通过读取jq
的输出while IFS= read -r entry; do
循环。
BUCKETS=()
while IFS= read -r entry; do
BUCKETS+=("$entry")
done < <(jq '.data | .[].name' output.json)
然后将退出项附加到数组。
BUCKETS+=(Exit)
然后使用
select BUCKET in "${BUCKETS[@]}"; do
(select a in l; do
或select a in l\ndo
这里都不需要;
和 \n
。)
所有人都说,除非你需要output.json
其他东西,否则你也可以避免。
BUCKETS=()
while IFS= read -r entry; do
BUCKETS+=("$entry")
done < <(curl -H "Authorization:Bearer $ACCESS_TOKEN" https://api.runscope.com/buckets | python -mjson.tool | jq '.data | .[].name')