目標:bashでCURLリクエストで変数を使用するにはどうすればよいですか?
私はCloudFlareのAPIv4に接続するためのbash CURLスクリプトを使用しています。目標は、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の投稿を使用して、私は彼らの例に従おうとしているが、私はまだ何か間違っていると思う、ちょうど何を理解することはできません。 、チャールズ・ダフィーの答えが示唆するように、このためjqを使用
# set shell variables with your contents
email="yourEmail"
authKey="yourAuthKey"
zoneid="yourZoneId"
dnsrecord="yourDnsRecord"
# make sure we show errors; --silent without --show-error can mask problems.
current_ip=$(curl --fail -sS ipecho.net/plain) || exit
# optional: template w/ JSON content that won't change
json_template='{"type": "A", "name": "example.com"}'
# build JSON with content that *can* change with jq
json_data=$(jq --arg zoneid="$zoneid" \
--arg current_ip="$current_ip" \
'.id=$zoneid | .content=$current_ip' \
<<<"$json_template")
# ...and submit
curl -X PUT "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$dnsrecord" \
-H "X-Auth-Email: $email" \
-H "X-Auth-Key: $authKey" \
-H "Content-Type: application/json" \
--data "$json_data"
引用したりエスケープしなくてもJSON文書に文字通り代入することができないコンテンツがある場合は、IPアドレスの場合はそうではないので、合理的な場所です少し妥協する –
...私は '|| 'curl'の結果から代入の終了時に' exit'を実行します。失敗した場合には続かないので、 '[[$ current_ip]] || (または、 '#!/ bin/sh'、' [-n "$ current_ip"] || exit'を使っているので)、次の行に表示されます。 '--fail'は、curlの終了ステータスが失敗を反映していることを確認しますが、シェルが' -e'で実行されなかった場合、必ずしもその終了ステータスに従って動作するとは限りません。 –
はい、正確です。 JSONをテキストとして操作し、可能であればそれを避けるときは、非常に注意する必要があります。 * nixマシンにjqがない場合でも、おそらくPerlやPythonがあります。不確かな場合は、そのうちの1つを使用してJSONを準備します。 – nwk