如何在Shell脚本中解析JSON?

Java开发人员

我运行curl命令$(curl -i -o - --silent -X GET --cert "${CERT}" --key "${KEY}" "$some_url")并将响应保存在变量response中。$ {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"}并将“运行”和“详细信息”分配给两个不同的变量,在其中我可以同时打印状态和详细信息。同样,如果状态等于错误,则脚本应退出。我正在执行以下任务来完成任务-

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变量的值的方式)中不能出现的唯一字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章