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”*(我在这里绝望)在他们应该的时候没有成功匹配。我错过了什么?
答案 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 ]]