使用JSON输入在bash中创建选择菜单

时间:2015-01-22 17:36:51

标签: json bash

我正在尝试使用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

不幸的是,这不会创建退出选项。我能看到一个包含我想要的其他选项的菜单,除了退出选项。菜单和数组中的每个选项都有引号。如何显示“退出”选项?

2 个答案:

答案 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; doselect 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')