转换为的 Bash cUrl 响应在字符串比较中'identical'字符串不匹配


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

回声命令适当输出"活动"(一旦液滴处于活动状态(,但是while语句总是失败。

在查看了有关bash字符串比较的其他问题之后,我尝试了比较操作员每一侧周围的引号/无引号,并使用 *匹配可能的新线,但问题仍然存在。

试图确切地获得回声,我将输出输送到OD。这就是我得到的:

0000000 " a c t i v e " n 0000011

我可以在字符串之后看到新线,但是" Active"*," Active*",Active*和" A C T I V e"*(我在这里变得绝望(在应该有的时候无法成功匹配。我想念什么?

没有-rjq将不是返回active,而是"active",因为它的输出作为JSON数据逃脱了。但是,在您的比较中,右侧的引号为句法 - 被解析为外壳语法,而不是数据 - 因此,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 ]]
    

最新更新