我有一个工作的API(Linode)来更新域.因此,下面是一个正常的API调用,它可以很好地更新数据:
#!/bin/bash
# hardcoded data for testing
LINODE_API_KEY=1234
domain_id=1931316
domain_name="abx.com"
domain_type="master"
domain_email="hello@abx.com"
domain_ttl=30
# Update the domain
curl -H "Content-Type: application/json" \
-H "Authorization: Bearer ${LINODE_API_KEY}" \
-X PUT -d "{
\"domain\": \"${domain_name}\", \"type\": \"${domain_type}\", \"soa_email\": \"${domain_email}\", \"ttl_sec\": ${domain_ttl}
}" "https://api.linode.com/v4/domains/${domain_id}"
当我执行上面的更新API时,它工作得很好,我得到的json响应如下:
{"id": 1931316, "type": "master", "domain": "abx.com", "tags": [], "group": "", "status": "active", "errors": "", "description": "", "soa_email": "hello@abx.com", "retry_sec": 0, "master_ips": [], "axfr_ips": [], "expire_sec": 0, "refresh_sec": 0, "ttl_sec": 30, "created": "2022-12-13T09:01:01", "updated": "2022-12-14T03:26:27"}
但问题是我想在数据中使用变量.因此,我将上面的工作代码更改为(带有我想要传递的额外数据):
#!/bin/bash
# hardcoded data for testing
LINODE_API_KEY=1234
domain_id=1931316
domain_name="abx.com"
domain_type="master"
domain_email="hello@abx.com"
domain_ttl=30
# This value must be provided first
if [ -z "${domain_name}" ]; then
echo "You must provide domain name"
exit 1
else
change_domain_name="\\\"domain\\\": \\\"${domain_name}\\\""
fi
if [ -n "${domain_type} ]; then
change_domain_type=", \\\"type\\\": \\\"${domain_type}\\\""
else
change_domain_type=""
fi
if [ -n "${soa_email} ]; then
change_domain_email=", \\\"soa_email\\\": \\\"${domain_email}\\\""
else
change_domain_email=""
fi
if [ -n "${domain_ttl} ]; then
change_domain_ttl=", \\\"ttl_sec\\\": ${domain_ttl}"
else
change_domain_ttl=""
fi
update_string="${change_domain_name}${change_domain_type}${change_domain_email}${change_domain_ttl}"
# Update the domain
curl -H "Content-Type: application/json" \
-H "Authorization: Bearer ${LINODE_API_KEY}" \
-X PUT -d "{
"${update_string}" # THE PROBLEM IS HERE WHEN USING THIS VARIABLE
}" "https://api.linode.com/v4/domains/${domain_id}"
API会抱怨无效的JSON
{"errors": [{"reason": "Invalid JSON"}]}
但是当我使用echo ${update_string}
变量时,我会得到与我使用的相同的数据语法,那么为什么它会抱怨这是无效的呢?
我甚至可以将上面的 echo 结果复制粘贴到-d数据中,它工作得很好.
我将我的问题回滚到原来的问题,以解释为什么我使用上面的方法,而不是像@Arnaud VALMARY建议的那样创建jq --arg
.
例如,在这里,我只想传递值DOMAIN_NAME和DOMAIN_ttl.因此,更新字符串的值如下所示:
Update_string="${change_domain_name}${change_domain_ttl}"
其他人都是空的.所以,我不确定如何使用jq --arg
实现这一点
简而言之,如果DOMAIN_TYPE=""或DOMAIN_TYPE为空,我不希望这个变量出现在--arg选项中,因此用户可以 Select 不更新此值.