我运行curl命令$(curl -i -o - --silent -X GET --cert "${CERT}" --key "${KEY}" "$some_url")并将响应保存在变量响应中。${response}如下所示

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 34
Connection: keep-alive
Keep-Alive: timeout=5
X-XSS-Protection: 1;

{"status":"running","details":"0"}

我想解析JSON{"status":"running","details":"0"}并将“running”和“details”分配给两个不同的变量,在这里我可以同时打印状态和详细信息。此外,如果状态等于错误,脚本应该退出。我正在做以下工作来完成这项任务-
status1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.status')
details1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.details')
echo "Status: ${status1}"
echo "Details: ${details1}"
if [[ $status1 == 'error' ]]; then
    exit 1
fi

我不想解析JSON两次,而只想解析一次。因此,我希望合并以下行,但仍将状态和详细信息分配给两个单独的变量-
status1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.status')
details1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.details')

最佳答案

首先,停止使用-i参数来curl。这就不需要awk(或者在事实发生后对头进行任何其他修剪)。
第二:

{
  IFS= read -r -d '' status1
  IFS= read -r -d '' details1
} < <(jq -r '.status + "\u0000" + .details + "\u0000"' <<<"$response")

使用NUL作为分隔符的好处是,它是C样式字符串的值中不能出现的唯一字符(这就是shell变量值的存储方式)。

关于json - 如何在Shell脚本中解析JSON?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53508885/

10-09 18:12
查看更多