Bli*_*awk 2 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
Run Code Online (Sandbox Code Playgroud)
echo 命令适当地输出“active”(一旦 Droplet 处于活动状态),但 while 语句总是失败。
在查看了有关 bash 字符串比较的其他问题后,我尝试在比较运算符的每一侧使用引号/无引号,并使用 * 来匹配可能的换行符,但问题仍然存在。
为了准确获取 echo 的内容,我将输出通过管道传输到 od。这就是我得到的:
0000000 " a c t i v e " \n 0000011
Run Code Online (Sandbox Code Playgroud)
我可以看到字符串后面的换行符,但“active”*、“active*”、active* 和“active”*(我在这里变得绝望)在它们应该匹配的时候没有成功匹配。我缺少什么?
jqwithout-r将返回 not activebut "active",因为它的输出被转义为 JSON 数据。然而,在比较中,右侧的引号是语法性的——解析为 shell 语法,而不是数据——因此 shell 会将管道的输出与 进行比较active,这是一个不包含任何引号的字符串。
我立即想到两种方法:
在比较的右侧包含文字而不是语法引号:
[[ $(curl ... | jq ...) = '"active"' ]] # option 1: outer single quotes
[[ $(curl ... | jq ...) = \"active\" ]] # option 2: escape the double quotes
Run Code Online (Sandbox Code Playgroud)使用-r参数 tojq发出原始字符串,从而抑制输出中的引号:
[[ $(curl ... | jq -r ...) = active ]]
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |