serii81
@serii81
Я люблю phр...

Как в bash создать динамический select?

Всем привет.
Есть файл json
{
  "sites": [
    {
      "title": "la-colina",
      "admin": [
        "https://app.asana.com/0/1204691114096484/1204691114438711"
      ],
      "front": ["http://lc-la-colina.local/wp-admin/", "http://lc-la-colina.local/"]
    }
  ]
}


Я хочу создать селект, который выберет проект, потом появится еще один селект, который выберет admin или front, и откроет все ссылки из массива в браузер.

Пока у меня етсь проблема с динамичностью select.

#!/bin/bash

jsonlist=$(jq -r '.sites' "sites.json")
select_options=()
# inside the loop, you cant use the fuction _jq() to get values from each object.
for row in $(echo "${jsonlist}" | jq -r '.[] | @base64'); do
  _jq()
  {
    echo ${row} | base64 --decode | jq -r ${1}
  }

  select_options+=($(_jq '.title'))
done


select action in "${select_options[@]}" 
do
  case "$REPLY" in
    for i in "${!select_options[@]}"; do
      "${select_options[$i]}") echo "You picked which is option $i";;
    done
    $((${#select_options[@]}+1))) echo "Goodbye!"; break;;
    *) echo "Invalid option. Try another one.";continue;;
  esac
done

exit 0


Как сделать for внутри select? Если это возможно.
  • Вопрос задан
  • 163 просмотра
Решения вопроса 2
xotkot
@xotkot
хорошо есть и хорошо весьма
можно как вариант использовать jless, там тебе и json-меню и копирование данных, хотя с копированием там у некоторых наблюдаются проблемы.

другой вариант, это вместо баш-партянки взять тот же fzf и скормить ему одноранговое меню доступных вариантов что позволит легко отсортировать и выделить необходимое
cat sites.json | jq -r '.sites[] | "\(.title)\tadmin\t\(.admin[])\n\(.title)\tfront\t\(.front[])"' | sort -u | fzf -m --delimiter "\t" --nth 1,2 | awk '{print $3}'

мультивыделение срабатывает по табу
довольно удобно для небольших меню
в целом это будет выглядеть примерно так
zDboUomqo5lzjUJrHf2Lcsaqr.svg
Ответ написан
3vi1_0n3
@3vi1_0n3
Исходя из описания задачи вот так:
#!/bin/bash

select site in $(jq -r '.sites[].title' sites.json) 
do
    select area in "admin" "front"
    do
        # get links for "area"
        links=$(jq '.sites[] | select(.title == "'${site}'") | .'${area}' |.[]' sites.json)
        # here you can do whatever you want - iterate through links, opening them with xdg-open, or just print them out
        echo $links
        break
    done
    break;
done

Если это не то, что надо, уточните описание.

Если надо динамически брать набор ключей с исключением "title", то
select area in "admin" "front"
заменить на
select area in $(jq -r '.sites[] | select(.title == "'${site}'") | keys | .[] | select(. != "title")' sites.json)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
select, for, while, until - это просто четыре команды, которые создают цикл.
То есть
for a in 1 2; do
 for b in 1 3; do
   select list; do
     while something; do
       break
     done
  done
 done
done

это нормальная работа всех циклов..

А у вас в скрипте case или лишний или криво написан, как мне кажется.

Не совсем понял задачу, но может попробуйте поковыряться в этом примере:
jsonlist="$(jq '.[][]|keys[]' sites.json|tr -d \")"
select action in ${jsonlist};do
  echo "[$action]"
  test "$action" == "title" && break
  newlist="$(jq ".[][][\"$action\"][]" sites.json)"
  echo "$newlist"
done
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы