while循环[:参数过多

时间:2018-07-11 13:56:02

标签: bash

解析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

有人知道为什么以及如何纠正它吗?

2 个答案:

答案 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产生匹配的日期。