gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:53:14 26 4
gpt4 key购买 nike

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 字符串比较的其他问题后,我尝试在比较运算符的每一侧使用引号/不加引号,并使用 * 来匹配可能的换行符,但问题仍然存在。

为了准确获取 echo 的内容,我将输出通过管道传输到 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 语法,而不是数据 - 因此 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 ]]

关于string - Bash cUrl 响应转换为字符串 - 在字符串比较中与 'identical' 字符串不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44770380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com