代码之家  ›  专栏  ›  技术社区  ›  Evgenii

while循环[:参数太多

  •  0
  • Evgenii  · 技术社区  · 8 年前

    在分析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 回复  |  直到 8 年前
        1
  •  1
  •   larsks    8 年前

    您需要引用 $(...) 管道,因为输出包含空白。例如,考虑一下:

    $ [ $(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
    
        2
  •  0
  •   chepner    8 年前

    用这个容易多了 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 生成匹配的日期。

    推荐文章