2016-04-29 16 views
0

jsonレスポンスのエンドポイントをカールし、ファイルにレスポンスを書き込みます。 これまでのスクリプトは次のとおりです。Bash:文字列が存在する場合、jsonレスポンスをチェックしてファイルに書き込みします。

1)。ファイルが存在しない場合はカールし、 2)。それ以外の場合は変数を設定します

#!/bin/bash 
instance="server1" 
curl=$(curl -sk https://my-app-api.com | python -m json.tool) 
json_response_file="/tmp/file" 

if [ ! -f ${json_response_file} ] ; then 
    ${curl} > ${json_response_file} 
    instance_info=$(cat ${json_response_file}) 
else 
    instance_info=$(cat ${json_response_file}) 
fi 

問題は、ファイルが応答が不良であるか、空である可能性があります。 おそらくbashを使うまで、私はしたいです

(1)。 curlレスポンスのフィールドに$ instanceが含まれていることを(JQを使用して)チェックしてから、そのファイルだけを書き込みます。

(2)。レスポンスに$ instance

(3)が含まれるまで、curl XX回数を再試行してください。応答に$ instance

(4)が含まれていれば、ファイルを書きます。上記が正しく行われたときに変数instance_info = $(cat $ {json_response_file})を設定してください。私はこのように始まっ

は...その後、捕まってしまった...

until [[ $(/usr/bin/jq --raw-output '.server' <<< ${curl}) = $instance ]] 
do 
+0

は動作しませんあなたの条件を実行し、またはこれは問題ですロジックの実装方法を理解していますか? –

+0

'' jq'を持っているときになぜ '' python -m json.tool'が必要ですか? –

+0

その論理を解明しようとする問題。私は本当にpython -m json.toolは必要ありません。 – Narrabit10

答えて

0

一つまともな実装は次のようになります。

retries=10 
instance=server1 
response_file=filename 

# define a function, since you want to run this code multiple times 
# the old version only ran curl once and reused that result 
fetch() { curl -sk https://my-app-api.com; } 

instance_info= 
for ((retries_left=retries; retries_left > 0; retries_left--)); do 
    content=$(fetch) 
    server=$(jq --raw-output '.server' <<<"$content") 
    if [[ $server = "$instance" ]]; then 
    # Writing isn't atomic, but renaming is; doing it this way makes sure that no 
    # incomplete response will ever exist in response_file. If working in a directory 
    # like /tmp where others users may have write, use $(mktemp) to create a tempfile with 
    # a random name to avoid security risk. 
    printf '%s\n' "$content" >"$response_file.tmp" \ 
     && mv "$response_file.tmp" "$response_file" 
    instance_info=$content 
    break 
    fi 
done 
[[ $instance_info ]] || { echo "ERROR: Giving up after $retries retries" >&2; } 
+0

ありがとうございました。今すぐ私はあなたのコードを理解していることを確認します。もう一度ありがとう – Narrabit10

+0

ご不明な点がありましたらお気軽にお問い合わせください。例えば、関数のカプセル化は、BashFAQ#50:http://mywiki.wooledge.org/BashFAQ/050 –

+0

でカバーされています。他のいくつかは、外部から提供されたときに 'echo'より' printf'を優先します。データはもう少しわかりにくいです - 好奇心が強い場合は、 'echo'のためのPOSIX仕様のAPPLICATION USAGEセクション、http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.htmlを参照してください。 –

関連する問題