Разбор JSON болезнен в сценарии оболочки. С помощью более подходящего языка создайте инструмент, который извлекает атрибуты JSON в соответствии с соглашениями об использовании сценариев оболочки. Вы можете использовать свой новый инструмент для решения непосредственной проблемы с сценарием оболочки, а затем добавить его в свой комплект для будущих ситуаций.
Например, рассмотрите инструмент jsonlookup , чтобы, если я скажу jsonlookup access token id
он вернет атрибут id , определенный в атрибуте токен , определенный в атрибуте access из stdin, который, по-видимому, является данными JSON. Если атрибут не существует, инструмент ничего не возвращает (статус выхода 1). Если синтаксический анализ не выполняется, выйдите из состояния 2 и передайте сообщение stderr. Если поиск завершен, инструмент печатает значение атрибута.
Создав инструмент unix для точной цели извлечения значений JSON, вы можете легко использовать его в сценариях оболочки:
access_token=$(curl <some horrible crap> | jsonlookup access token id)
Любой язык будет использоваться для реализации jsonlookup . Вот довольно краткая версия python:
#!/usr/bin/python
import sys
import json
try: rep = json.loads(sys.stdin.read())
except:
sys.stderr.write(sys.argv[0] + ": unable to parse JSON from stdin\n")
sys.exit(2)
for key in sys.argv[1:]:
if key not in rep:
sys.exit(1)
rep = rep[key]
print rep