解析json对象后
{
"result" : {
"period" : 1,
"unit" : "day",
"type" : "database",
"relevant_date" : "2018-07-10 00:00:00",
"load_date" : "2018-07-10 00:00:00",
"created" : "2018-07-05 12:23:07",
"metrics" : { }
},
"errorMessage" : "",
"status" : "OK"
}
使用bash和python
curl -s 'url' | python -c "import sys, json; print json.load(sys.stdin)['result']['load_date']"
并获得以下结果
2018-07-10 00:00:00
我尝试检查此值是否与预定义的值匹配,以及是否不调用sleep。
while [ $(curl -s 'url' | python -c "import sys, json; print json.load(sys.stdin)['result']['load_date']") != '2018-07-10 00:00:00' ]
do
sleep 5s
done
但是得到[: too many arguments
有人知道为什么以及如何纠正它吗?
答案 0 :(得分:1)
您需要引用$(...)
管道的输出,因为输出包含空格。例如,考虑一下:
$ [ $(echo this is a test) = "this is a test" ] && echo "it matched"
-bash: [: too many arguments
相对于此:
$ [ "$(echo this is a test)" = "this is a test" ] && echo "it matched"
it matched
答案 1 :(得分:0)
使用jq
可以轻松得多:
filter='.result.load_date | select(. == "2018-07-10 00:00:00")'
until curl -s 'url' | jq -e "$filter" > /dev/null; do
sleep 5s
done
如果匹配所需的日期,过滤器将输出加载日期,否则不输出任何内容。当没有输出时,-e
选项为jq
提供一个非零的退出状态,这导致until
循环继续直到jq
产生匹配的日期。