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"*(我在这里变得绝望(在应该有的时候无法成功匹配。我想念什么?
没有-r
的jq
将不是返回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 ]]