Назад | Перейти на главную страницу

Запустите команду bash с параметрами json из jq

Как я могу запустить команду bash для каждого объекта json в массиве json с помощью jq? Пока у меня есть это:

cat credentials.json | jq -r '.[] | .user, .date, .email' | mycommand -u {user} -d {date} -e {email}

Похоже, это не работает. Как я могу взять параметры из массива json в мою команду?

Мой файл json выглядит примерно так:

[
   "user": "danielrvt",
   "date": "11/10/1988",
   "email": "myemail@domain.com",
   ...
]

Вот решение, основанное на мой ответ на аналогичный вопрос о переполнении стека.

#!/bin/bash
json='
[
  {
   "user": "danielrvt",
   "date": "11/10/1988",
   "email": "myemail@domain.com"
  }, 
  {
   "user": "anotheruser",
   "date": "1/1/1970",
   "email": "anotheruser@domain.com"
  }
]
'

jq -M -r '
    .[] | .user, .date, .email
' <<< "$json" | \
while read -r user; read -r date; read -r email; do
   echo "$user $date $email"
done

Пример вывода

danielrvt 11/10/1988 myemail@domain.com
anotheruser 1/1/1970 anotheruser@domain.com

В вашем случае вы можете заменить использование <<< "$json" с участием < credentials.json и echo "$user $date $email" с участием mycommand -u "$user" -d "$date" -e "$email" по мере необходимости, но это должно прояснить основную идею.

вы можете использовать цикл for, например

#!/bin/bash

JSONARRAY=$(cat credentials.json | jq -r '.[] | .user, .date, .email' | mycommand -u {user} -d {date} -e {email} | grep -v "[\|]")
for line in $JSONARRAY; do
    some command
done