Цель:Как использовать переменную в запросе CURL с bash?
Я использую CURL Баш скрипт для подключения к Cloudflare APIv4. Цель состоит в том, чтобы обновить A-запись. Мой сценарий:
# Get current public IP
current_ip=curl --silent ipecho.net/plain; echo
# Update A record
curl -X PUT "https://api.cloudflare.com/client/v4/zones/ZONEIDHERE/dns_records/DNSRECORDHERE" \
-H "X-Auth-Email: EMAILHERE" \
-H "X-Auth-Key: AUTHKEYHERE" \
-H "Content-Type: application/json" \
--data '{"id":"ZONEIDHERE","type":"A","name":"example.com","content":"'"${current_ip}"'","zone_name":"example.com"}'
Проблема:
Переменная current_ip не печатается, когда я называю это в моем сценарии. Выход будет "content" : ""
, а не "content" : "1.2.3.4"
.
Я использовал other stackoverflow posts, и я пытаюсь следовать их примерам, но я думаю, что я все еще делаю что-то неправильно, просто не могу понять, что. :(
Основное место, где это падает, - это если у вас есть контент, который нельзя буквально заменить в документе JSON без необходимости кавычек или экранирования, но это вряд ли произойдет для IP-адреса, поэтому это разумное место немного скомпрометировать. –
... Я мог бы поставить '|| exit' в конце задания из результатов 'curl', так что мы не будем продолжать работу в случае сбоя или' [[$ current_ip]] || exit' (или, скорее, поскольку вы используете '#!/bin/sh',' [-n "$ current_ip"] || exit') на следующей строке; '--fail' гарантирует, что статус выхода curl отражает сбой, но если оболочка не была запущена с' -e', это не обязательно будет вести себя в соответствии с этим статусом выхода. –
Да, точно. Вы должны быть очень осторожны при манипулировании JSON как текстом и избегать его, если это возможно. Даже если ваша машина * nix не имеет jq, она, вероятно, имеет Perl или Python. Если вы сомневаетесь, используйте один из них, чтобы подготовить JSON. – nwk