Установка вывода jq в переменную Bash

Использование pstree значительно упрощает проблему, но некоторые уточнения могут помочь.

Когда вы запускаете screen, он запускает два процесса: screen (родительский) и SCREEN (дочерний):

  • -Параметр ls screen показывает идентификатор сеанса с идентификатором процесса дочернего пользователя.
  • Для обеспечения согласованности необходимо перечислить родительский идентификатор процесса.
  • Это помогает отобразить список аргументов; pstree может это сделать.
  • Вы можете иметь несколько сеансов экрана на одном компьютере.

Связывание их вместе требует сценария. Вот пример:

# $Id: ps-screen,v 1.1 2016/10/23 22:19:56 tom Exp $
# http://unix.stackexchange.com/questions/172347/list-processes-running-inside-of-screen-manager-with-with-vt100-ansi-terminal-e
screen -ls | awk '/[0-9]+\./{print;}' | while read session
do
    child=$(echo "$session" | awk '{sub("\..*","",$1); print $1;}')
    printf '%s\n' "$session"
    parent=$(ps -p $child -o ppid=)
    pstree -p -a $parent
done

и пример вывода, для двух сеансов:

~ (101) ps-screen 
38142.pts-1.vmw-debian7-64      (10/23/2016 06:20:28 PM)        (Attached)
screen,38141
  └─screen,38142
      └─tcsh,38143
          └─ps-screen,38161 /users/tom/bin/ps-screen
              └─ps-screen,38164 /users/tom/bin/ps-screen
                  └─pstree,38169 -p -a 38141
3975.pts-0.vmw-debian7-64       (10/23/2016 06:15:28 AM)        (Attached)
screen,3974
  └─screen,3975
      ├─tcsh,5002
      │   └─ded,19926 /usr/build//ncurses
      │       └─vile,24647 /usr/build/ncurses/ncurses-6.0-20161029/NEWS
      └─tcsh,36551
          └─ded,36569 /tmp

Дальнейшее чтение:

13
31.03.2017, 00:41
4 ответа

Изменил код на этот, и он сработал:

content=$(curl -s  -X GET -H "Header:Value" http://127.0.0.1:8200/etc) 
username=$( echo jq -r  '.data.value' <<< "${content}" ) 
echo ${username}
24
27.01.2020, 19:53

Это работает, только если вы потеряли "эхо" во второй строке.

content=$(curl -s  -X GET -H "Header:Value" http://127.0.0.1:8200/etc) 
username=$( echo jq -r  '.data.value' <<< "${content}" ) 
echo ${username}
5
27.01.2020, 19:53

Вы можете преобразовать его в однострочный как:

username=$( curl -s  -X GET -H "Header:Value" http://127.0.0.1:8200/etc |  jq -r  '.data.value' ) 
echo ${username}
4
27.01.2020, 19:53

Вы можете использовать встроенную функцию bash readвместе с подстановкой процесса, соединяющей вывод jq с FIFO:

read username < <(curl -s -X GET -H "Header:Value" http://127.0.0.1:8200/etc | jq -r '.data.value')

Пока вам нужно присвоить только одно значение jq, другие предлагаемые решения проще. Настоящее решение с readполезно, когда вам нужно назначить несколько клавиш нескольким переменным оболочки за один раз; тогда вам просто нужно использовать read var1 var2 var3 < <(...).

Вот более общие фрагменты для назначения вывода jq переменным оболочки, которые могут быть очень удобными.

Два метода для одиночного -линейного ввода (без петли):

IFS=$'\n' read -rd '' a b < <(echo '{"a":"1","b":"2"}' | jq -r '(.a,.b)'); declare -p a b
  declare -- a="1"
  declare -- b="2"

read a b < <(echo '{"a":"1","b":"2"}' | jq -r '[.[]] | @tsv'); declare -p a b
  declare -- a="1"
  declare -- b="2"

Примечание1 :@tsv использует разделитель пробелов; для значений, которые могут содержать пробелы, вы можете использовать формат @csv. Note2:IFS=$'\n' read -rd '' a b <предполагает, что нет пустых выходных строк. Если некоторые ключи json пусты, вы можете использовать «jq» без «--raw» и удалить после "с a=${a:1:-1}, или вы можете использовать readarrayвместоread(ср. пример ниже ).

Три метода ввода нескольких -строк (с петлей):

echo '[{"a":"1","b":"2"},{"a":"3","b":"4"}]' |
  jq -r '.[]' | jq -r '{a, b} | [.[]] | @csv' |
  while IFS= read -r i; do
    IFS=, read -r a b <<< "$i"; a=${a:1:-1}; b=${b:1:-1}; declare -p a b;
  done

  declare -- a="1"
  declare -- b="2"
  declare -- a="3"
  declare -- b="4"

echo '[{"a":"1","b":"2"},{"a":"3","b":"4"}]' |
  jq -r '.[]' | jq -r '(.a,.b)' |
  while IFS= read -r a; do
    IFS= read -r b; declare -p a b;
  done

  declare -- a="1"
  declare -- b="2"
  declare -- a="3"
  declare -- b="4"

echo '[{"a":"1","b":"2"},{"a":"3","b":"4"}]' |
  jq -r '.[]' | jq -r '(.a,.b)' |
  while readarray -n2 lines && [ ${#lines} -ne 0 ]; do
    a="${lines[0]:0:-1}"; b="${lines[1]:0:-1}"; declare -p a b;
  done

  declare -- a="1"
  declare -- b="2"
  declare -- a="3"
  declare -- b="4"
0
11.02.2021, 15:17

Теги

Похожие вопросы