Bash cUrl 响应转换为字符串 - 在字符串比较中不匹配 'identical' 字符串
Bash cUrl response converted to string - won't match 'identical' string in string comparison
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 字符串比较的其他问题后,我尝试在比较运算符的每一侧加上引号 marks/no 引号,并使用 * 来匹配可能的换行符,但问题是坚持。
为了准确获取回显的内容,我将输出通过管道传输到 od。
这是我得到的:
0000000 " a c t i v e " \n 0000011
我可以看到字符串后面的换行符,但是 "active"*、"active*"、active* 和 " a c t i v e "*(我在这里感到绝望)在应该匹配时没有成功匹配.我错过了什么?
没有 -r
的 jq
将返回的不是 active
,而是 "active"
,因为它的输出被转义为 JSON 数据。但是,在您的比较中,右侧的引号是 syntactic - 解析为 shell 语法,而不是数据 - 所以 shell 正在比较管道输出到 active
,一个不包含任何引号的字符串。
立即想到两种方法:
在比较的右侧包括文字引号而不是句法引号:
[[ $(curl ... | jq ...) = '"active"' ]] # option 1: outer single quotes
[[ $(curl ... | jq ...) = \"active\" ]] # option 2: escape the double quotes
使用 jq
的 -r
参数发出原始字符串,从而在其输出中抑制引号:
[[ $(curl ... | jq -r ...) = active ]]
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 字符串比较的其他问题后,我尝试在比较运算符的每一侧加上引号 marks/no 引号,并使用 * 来匹配可能的换行符,但问题是坚持。
为了准确获取回显的内容,我将输出通过管道传输到 od。 这是我得到的:
0000000 " a c t i v e " \n 0000011
我可以看到字符串后面的换行符,但是 "active"*、"active*"、active* 和 " a c t i v e "*(我在这里感到绝望)在应该匹配时没有成功匹配.我错过了什么?
-r
的 jq
将返回的不是 active
,而是 "active"
,因为它的输出被转义为 JSON 数据。但是,在您的比较中,右侧的引号是 syntactic - 解析为 shell 语法,而不是数据 - 所以 shell 正在比较管道输出到 active
,一个不包含任何引号的字符串。
立即想到两种方法:
在比较的右侧包括文字引号而不是句法引号:
[[ $(curl ... | jq ...) = '"active"' ]] # option 1: outer single quotes [[ $(curl ... | jq ...) = \"active\" ]] # option 2: escape the double quotes
使用
jq
的-r
参数发出原始字符串,从而在其输出中抑制引号:[[ $(curl ... | jq -r ...) = active ]]