не в состоянии хранить вывод sed в переменную - PullRequest
0 голосов
/ 05 октября 2018

Я новичок в скрипте bash.Я получаю некоторый ответ JSON, и я получаю только одно свойство из ответа.Я хочу сохранить его в переменной, но он не работает token=$result |sed -n -e 's/^.*access_token":"//p' | cut -d'"' -f1 echo $token он возвращает пустую строку.Я не могу использовать JQ или любые сторонние инструменты.Пожалуйста, дайте мне знать, что мне не хватает.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Попробуйте:

token="$(sed -E -n -e 's/^.*access_token": ?"//p' <<<"$result" | cut -d'"' -f1)"

Объяснение:

  • token="$( script here )" означает, что $ token установлен на вывод / результат выполнения сценария внутри subshell через процесс, известный как замена команды
  • -E в sed позволяет Расширенные регулярные выражения .Мы хотим этого, потому что JSON обычно содержит пробел после : и перед следующим ".Мы используем ? после пробела, чтобы сообщить sed, что пробел может или не может присутствовать.
  • <<<"$result" - это herestring , который передаетданные в sed как stdin вместо файла.
0 голосов
/ 05 октября 2018

Ваша команда должна быть:

token=$(echo "$result" | sed -n -e 's/^.*access_token":"//p' | cut -d'"' -f1)

Вам нужно использовать echo, чтобы напечатать содержимое переменной через стандартный вывод, и вам нужно использовать подстановку команды $( ), чтобы назначить выводконвейера до token.

Всегда рекомендуется заключать в кавычки ваши переменные, чтобы избежать проблем с пробелами и символами глобуса, такими как *.


В качестве отступления, обратите внимание, чтовы, вероятно, можете получить вывод, используя что-то вроде:

token=$(jq -r .access_token <<<"$result")

Я знаю, вы сказали, что вы не можете использовать jq, но это отдельный двоичный файл (не нужно его устанавливать), который обрабатывает ваш JSONправильно, а не как произвольный текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...