Похоже, содержание ответа представляет собой одну строку. Вы можете использовать два read
вызова для чтения двух строк:
curl -s -w "\n%" 'https://swapi.co/api/people/1/?format=json' | { read body read code echo $code jq .name <<< "$body" }
У меня есть конечная точка, которая возвращает JSON (тело ответа). Мне нужно получить, свернув тело ответа и обработав его (например, с помощью jq). Оно работает:
response=$(curl -s https://swapi.co/api/people/1/?format=json) name=$(echo $response tmpFile | jq '.name') # irrelevant command, but I need here response body echo "name:"$name
Но мне также нужно показать код HTTP (чтобы показать, если запрос выполнен успешно):
curl -s -w "%\n" -o /dev/null https://swapi.co/api/people/1/?format=json
Как получить тело ответа на переменную и показать HTTP-код одновременно (один запрос)?
Я нашел решение с временным файлом:
touch tmpFile curl -s -w "%\n" -o tmpFile https://swapi.co/api/people/1/?format=json name=$(cat tmpFile | jq '.name') # irrelevant command, but I need here only body response echo "name: "$name rm tmpFile
Как обойтись без создания файла?
Я пытаюсь с именованным каналом (но это все еще нужно для создания файла на диске ...):
mkfifo tmpFifo curl -s -w "%\n" -o tmpFifo https://swapi.co/api/people/1/?format=json name=$(cat tmpFifo | jq '.name') # irrelevant command, but I need here only body response echo "name: "$name rm tmpFifo
Но именованная труба не удаляется.
Есть решение без создания какого-либо файла, например, только переменные ведьмы или потоки?
Похоже, содержание ответа представляет собой одну строку. Вы можете использовать два read
вызова для чтения двух строк:
curl -s -w "\n%" 'https://swapi.co/api/people/1/?format=json' | { read body read code echo $code jq .name <<< "$body" }
Решение с телом возврата и HTTP-кодом в последней строке:
response=$(curl -s -w "\n%" https://swapi.co/api/people/1/?format=json) response=($) # convert to array code=$ # get last element (last line) body=$-1} # get all elements except last name=$(echo $body | jq '.name') echo $code echo "name: "$name
Но все же я бы предпочел сделать это с двумя отдельными переменными / потоками вместо объединенного тела ответа и HTTP-кода в одной переменной.