2016-10-11 9 views
0

私はバッチスクリプトの新機能ですので、これが明白であれば謝りますが、同様の情報は見つかりませんでした。 バッチスクリプトで使用すると、cURL操作が異なる動作をします

は、私は、次のcURLの呼び出しを実行しようとしている:

curl -H "Content-Type:application/json" -d '{"lt":"f","sort":"n","max":"1500","offset":"1500"}' [API_KEY]@api.nal.usda.gov/ndb/list 

私は、コマンドライン(またはCygwinの)でその行を実行すると、それは私がそれをしたいまさにありません。

しかし、バットファイルから呼び出そうとすると、パラメータがどうにか乱れているようです。

FOR /L %%A IN (0, 1500, 77500) DO (
    curl -H "Content-Type:application/json" -d '{"lt":"f","sort":"n","max":"1500","offset":"%%A"}' [API_KEY]@api.nal.usda.gov/ndb/list > %%A.txt 
) 

私は正しい.txtファイルに出力を取得していますが、オフセットで%% Aが置き換えられつつあるようにそれはいないようです。私はAPIから "悪いパラメータ"の例外を取得しています。コマンドラインの出力から、正確に見えます。

私はbashスクリプティングを使用するのが理にかなっていますが、bashを使用して同じ問題が発生していました。

:少なくともbash

+0

「curl -H」コンテンツタイプ:application/json「-d」{"lt": "f" ^、 "sort": "n" ^、 "max": "1500" ^、 "offset": "%% A"} '[API_KEY] @ api.nal.usda.gov/ndb/list> %% A.txt'(トークンセパレータを構成するすべてのカンマは '^'のようにエスケープされますそうでなければバッチファイルでは、一重引用符は文字列マーカーとして認識されないので)... – aschipfl

答えて

1

(注意私は例のプレースホルダと私のAPIキーを置き換え...それは問題ではない)、問題は変数の展開は、単一引用符内で発生していないということです。あなたは二重引用符を使用して、ネストされた二重引用符をエスケープする必要があります。

for a in 0 1500 77500; do 
    curl -H "Content-Type:application/json" -d "{\"lt\":\"f\",\"sort\":\"n\",\"max\":\"1500\",\"offset\":\"$a\"}" [API_KEY]@api.nal.usda.gov/ndb/list > "$a".txt 

私はあなたがバッチファイルで同等の操作を行う必要があると思います。

あなたはエスケープ引用符の数を最小限にするために、隣接する単一および二重引用符で囲まれた文字列を連結することができます

... -d '{"lt": "f", "sort": "n", "max": "1500", "offset": "'"$a"'"}' ... 

いますが、他の二つのオプションのいずれかを検討する必要があります。

curl -H "..." [email protected] [API_KEY]@api.nal.usda.gov/ndb/list > "$a".txt <<EOF 
{"lt": "f", "sort": "n", "max": "1500", "offset": "$a"} 
EOF 

したりするためにJSONを生成するjqのようなものを使用します:jqソリューションが望ましいだろう

curl -H "..." \ 
    -d "$(jq --arg a "$a" '{lt: "f", sort: "n", max: "1500", offset: $a}') \ 
    [API_KEY]@api.nal.usda.gov/ndb/list > "$a".txt 

まず、代わりにハードコーディングされた文字列を使用してのヒアドキュメントからデータを読み込みます一般的には、変数値の事前エスケープについて心配する必要がないからです。

+0

私は引用符とは何か関係があったと感じました。私はあなたが提示した一重引用符の例を使用して終了しました。ありがとう。 – Kornephoros

関連する問題