2016-05-27 20 views
2

目標: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" 

答えて

5

非常に良いアイデアですが、できれば」::(

+0

引用したりエスケープしなくてもJSON文書に文字通り代入することができないコンテンツがある場合は、IPアドレスの場合はそうではないので、合理的な場所です少し妥協する –

+0

...私は '|| 'curl'の結果から代入の終了時に' exit'を実行します。失敗した場合には続かないので、 '[[$ current_ip]] || (または、 '#!/ bin/sh'、' [-n "$ current_ip"] || exit'を使っているので)、次の行に表示されます。 '--fail'は、curlの終了ステータスが失敗を反映していることを確認しますが、シェルが' -e'で実行されなかった場合、必ずしもその終了ステータスに従って動作するとは限りません。 –

+1

はい、正確です。 JSONをテキストとして操作し、可能であればそれを避けるときは、非常に注意する必要があります。 * nixマシンにjqがない場合でも、おそらくPerlやPythonがあります。不確かな場合は、そのうちの1つを使用してJSONを準備します。 – nwk

3

シェルスクリプトからJSONを編集するための信頼できる方法はjqを使用することです。 Tまたは、ここJQをインストールしたくないあなたは、プレーンPOSIXシェルで何ができるかである。

#!/bin/sh 
set -e 

current_ip="$(curl --silent --show-error --fail ipecho.net/plain)" 
echo "IP: $current_ip" 

# 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 @- <<END; 
{ 
    "id": "ZONEIDHERE", 
    "type": "A", 
    "name": "example.com", 
    "content": "$current_ip", 
    "zone_name": "example.com" 
} 
END 
+0

私はJQを使用して、問題のための美しい解決策だと思います!コードは、まっすぐ進むもとてもきれいで、ありがとうございましたコード!しかし、私はプレーンbを使用してみたいアドオンのない灰や、可能であればPythonやPerlを使用しないでください。私は私のポストでこれを言及しなかったので、私は答えとしてこれを受け入れる前に非jqオプションを探しています。 +1の解決策 –

関連する問題