如何在shell脚本中解析json响应?

joh*_*ohn 4 linux bash shell json wget

我正在使用 bash shell 脚本。我需要使用 shell 脚本执行 URL,然后解析来自它的 json 数据。

这是我的 URL -http://localhost:8080/test_beat点击该 URL 后我可以获得的响应将来自这两个 -

{"error": "error_message"}
{"success": "success_message"}
Run Code Online (Sandbox Code Playgroud)

下面是我的 shell 脚本,它使用 wget 执行 URL。

#!/bin/bash

DATA=$(wget -O - -q -t 1 http://localhost:8080/test_beat)
#grep $DATA for error and success key
Run Code Online (Sandbox Code Playgroud)

现在我不知道如何解析 $DATA 中的 json 响应并查看密钥是成功还是错误。如果密钥成功,那么我将打印一条消息“成功”并打印 $DATA 值,并以零状态代码退出 shell 脚本,但如果密钥错误,那么我将打印“错误”并打印 $DATA 值并以非零状态代码退出 shell 脚本。

如何在 shell 脚本中解析 json 响应并从中提取密钥?

我不想安装任何库来执行此操作,因为我的 JSON 响应是固定的,并且它始终与上面所示的相同,因此任何更简单的方法都可以。

更新:-

下面是我的最终 shell 脚本 -

#!/bin/bash

DATA=$(wget -O - -q -t 1 http://localhost:8080/tester)
echo $DATA
#grep $DATA for error and success key
IFS=\" read __ KEY __ MESSAGE __ <<< "$DATA"
case "$KEY" in
success)
    exit 0
    ;;
error)
    exit 1
    ;;
esac    
Run Code Online (Sandbox Code Playgroud)

这看起来正确吗?

小智 5

如果您要从 shell 使用任何更复杂的 json 并且可以安装其他软件,jq将是您的朋友。

因此,例如,如果您只想提取错误消息(如果存在),那么您可以执行以下操作:

$ echo '{"error": "Some Error"}' | jq ".error"
"Some Error"
Run Code Online (Sandbox Code Playgroud)

如果你在成功案例上尝试这个,它会做:

$echo '{"success": "Yay"}' | jq ".error"
null
Run Code Online (Sandbox Code Playgroud)

该工具的主要优点就是它完全理解 json。因此,无需担心极端情况等问题。