【问题标题】:Creating a Select Menu in bash using JSON input使用 JSON 输入在 bash 中创建选择菜单
【发布时间】:2015-01-22 17:36:51
【问题描述】:

我正在尝试使用 bash 中的选择功能创建一个菜单。我正在访问一个 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

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

【问题讨论】:

    标签: json bash


    【解决方案1】:

    $BUCKETS 正在扩展到BUCKETS 数组的第一个 元素。

    然后将其分词并用作您的选择条目。

    这是有道理的,因为您将 jq 子shell 用双引号括起来,这可以防止在那里发生分词(这意味着 IFS 更改没有做任何我认为的事情)。

    如果您的条目可以包含空格并且您希望将其正确分配给数组,方法是通过使用@987654326 读取jq 的输出@循环。

    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')
    

    【讨论】:

      【解决方案2】:

      代替

      jq '.data | .[].name' output.json
      

      试试

      jq -r '.data | .[].name' output.json
      

      (-r : 不带引号的原始数据)

      还有最重要的部分:

      select BUCKET in "${BUCKETS[@]}"
                                ^^^
                               ARRAY syntax
      

      【讨论】:

      • 这并没有解决jq 命令周围的环绕引号,这意味着这只会使选择菜单成为两个条目:所有jq 返回和Exit
      • @EtanReisner 关于他的观点是正确的。但为了解决这个问题,我只需要删除您在答案中指出的 Array 语法周围的引号。
      • @honestemu3 删除数组扩展周围的引号仍然会发生分词,并且您的元素不能包含空格。在数组扩展上使用引号是正确的用法。您首先通过引用jq 电话选择了自己做错事。看我的回答。 (哦,不仅空格不起作用。Shell 元字符也会导致问题。)
      猜你喜欢
      • 2023-03-09
      • 2018-11-29
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多