Bash cUrl响应转换为字符串 - 在字符串比较中不匹配“相同”字符串

时间:2017-06-26 23:58:22

标签: string bash curl digital-ocean

while [[ "$(curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" "https://api.digitalocean.com/v2/droplets/$NEW_ID" | jq '.droplet.status')" != "active" ]]; do                         
    echo "$(curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" "https://api.digitalocean.com/v2/droplets/$NEW_ID" | jq '.droplet.status')"                                            
    echo "try again"                                                                                       
    sleep 30s                                                                                              
done

echo命令适当地输出“active”(一旦Droplet处于活动状态),但while语句总是失败。

在查看有关bash字符串比较的其他问题后,我在比较运算符的每一边都尝试了引号/没有引号,并使用*来匹配可能的换行,但问题仍然存在。

为了获得确切的回声,我将输出传输到了od。 这就是我得到的:

0000000 " a c t i v e " \n 0000011

我可以看到字符串后面的换行符,但是“active”*,“active *”,active *和“a c t i v e”*(我在这里绝望)在他们应该的时候没有成功匹配。我错过了什么?

1 个答案:

答案 0 :(得分:3)

没有jq

-r将返回active而不是"active",因为其输出将作为JSON数据进行转义。但是,在您的比较中,右侧的引号是 syntactic - 解析为shell语法,而不是数据 - 因此shell将管道的输出与active进行比较,一个不包含任何引号的字符串。

立即想到两种方法:

  • 在比较的右侧包含文字而不是句法引号:

    [[ $(curl ... | jq ...) = '"active"' ]] # option 1: outer single quotes
    [[ $(curl ... | jq ...) = \"active\" ]] # option 2: escape the double quotes
    
  • 使用-r jq参数发出原始字符串,从而抑制其输出中的引号:

    [[ $(curl ... | jq -r ...) = active ]]