我正在使用bash shell脚本。我需要使用shell脚本执行URL,然后解析来自它的json数据。
这是我的网址 - http://localhost:8080/test_beat
,点击网址后我可以得到的回复来自这两个 -
{"error": "error_message"}
{"success": "success_message"}
下面是我的shell脚本,它使用wget执行URL。
#!/bin/bash
DATA=$(wget -O - -q -t 1 http://localhost:8080/test_beat)
#grep $DATA for error and success key
现在我不确定如何解析$ DATA中的json响应,看看密钥是成功还是错误。如果密钥成功,那么我将打印一条消息"成功"并打印$ DATA值并退出shell脚本,状态代码为零,但如果密钥错误,那么我将打印" error"并打印$ DATA值并以非零状态代码退出shell脚本。
如何解析json响应并从shell脚本中提取密钥?
我不想安装任何库来执行此操作,因为我的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
这看起来不错吗?
答案 0 :(得分:3)
如果您打算在shell中使用任何更复杂的json,并且可以安装其他软件,jq将成为您的朋友。
因此,例如,如果您只想提取错误消息(如果存在),那么您可以这样做:
$ echo '{"error": "Some Error"}' | jq ".error"
"Some Error"
如果您在成功案例中尝试此操作,则会执行以下操作:
$echo '{"success": "Yay"}' | jq ".error"
null
该工具的主要优点是它完全理解json。所以,不需要关注角落案例等等。
答案 1 :(得分:2)
#!/bin/bash
IFS= read -d '' DATA < temp.txt ## Imitates your DATA=$(wget ...). Just replace it.
while IFS=\" read -ra LINE; do
case "${LINE[1]}" in
error)
# ERROR_MSG=${LINE[3]}
printf -v ERROR_MSG '%b' "${LINE[3]}"
;;
success)
# SUCCESS_MSG=${LINE[3]}
printf -v SUCCESS_MSG '%b' "${LINE[3]}"
;;
esac
done <<< "$DATA"
echo "$ERROR_MSG|$SUCCESS_MSG" ## Shows: error_message|success_message
* %b
在相应的参数中展开反斜杠转义序列。
更新,因为我一开始并没有真正得到这个问题。它应该只是:
IFS=\" read __ KEY __ MESSAGE __ <<< "$DATA"
[[ $KEY == success ]] ## Gives $? = 0 if true or else 1 if false.
你可以进一步研究它:
case "$KEY" in
success)
echo "Success message: $MESSAGE"
exit 0
;;
error)
echo "Error message: $MESSAGE"
exit 1
;;
esac
当然可以用它做类似的明显测试:
if [[ $KEY == success ]]; then
echo "It was successful."
else
echo "It wasn't."
fi
从上次评论中可以简单地完成
IFS=\" read __ KEY __ MESSAGE __ <<< "$DATA"
echo "$DATA" ## Your really need to show $DATA and not $MESSAGE right?
[[ $KEY == success ]]
exit ## Exits with code based from current $?. Not necessary if you're on the last line of the script.
答案 2 :(得分:0)
你可能已经安装了python,它在标准库中进行了json解析。 Python不是shell脚本中单行的优秀语言,但这是一种使用它的方法:
#!/bin/bash
DATA=$(wget -O - -q -t 1 http://localhost:8080/test_beat)
if python -c '
import json, sys
exit(1 if "error" in json.loads(sys.stdin.read()) else 0)' <<<"$DATA"
then
echo "SUCCESS: $DATA"
else
echo "ERROR: $DATA"
exit 1
fi
答案 3 :(得分:0)
假设:
"success"
的存在,我建议以下简化:#!/bin/bash
wget -O - -q -t 1 http://localhost:8080/tester | grep -F -q '"success"'
exit $?
-F
告诉grep
搜索固定(字面)字符串。-q
告诉grep
不生成输出,而只是通过退出代码反映是否找到了匹配项。exit $?
只需退出grep
的退出代码($?
是一个反映最近执行的命令退出代码的特殊变量。)请注意,如果你关心的只是 wget
的输出是否包含"success"
,那么上面的管道就可以了 - 不需要捕获wget
在一个辅助中的输出。变量