2017-08-07 17 views
1

次のcurlコマンドはコマンドラインから動作します。私はサーバーから有効な応答を得ます。curlは動作しますが、BASHスクリプトでは実行されません。

curl -X POST https://somebaseurl/api/v1/auth/login -H "Content-Type:application/json" -d '{"email": "[email protected],com", "password": "foo"}' 

私はこの

baseUrl=https://somebaseurl 
contentTypeJson="\"Content-Type:application/json\"" 
credentials="'{\"email\": \"[email protected]",\"password\": \"foo\"}'" 
login="curl -X POST $baseUrl/api/v1/auth/login -H $contentTypeJson -d $credentials" 
echo ${login} 

response=`${login}` 
echo ${response} 

のようなbashスクリプトを記述しようとしていますしかし、私は、サーバーからの悪い要求応答を取得します。しかし、エコーされたカールコマンドを私の端末に直接コピーすれば動作します。私は間違って何をしていますか?

編集:

要求されたとして、私は、要求「POSTのAPI/V1 /認証/ログイン」[期待されるアプリケーション/ JSON]については 不正な要求を取得し、バッククォートで実行

+0

"私は悪い要求応答を得ています"あなたは何を得ていますか?あなたの質問を編集して、 – sircapsalot

+0

@sircapsalot done、 "ログイン"に – MaxPower

+0

という感謝を含むように編集し、 '-v'オプションをcurlコマンドに追加して冗長出力を有効にしてください。あなたのコマンドが予想通りに補間されていない可能性があります。 – sircapsalot

答えて

1

BashおよびcURLは、スクリプト内で引用符がどのように使用されるかを非常に具体的に示すことができます。エスケープがスローされると、他のすべてが簡単に失敗する可能性があります。 shellcheck.netでスクリプトを実行すると、そのような問題を特定する際に非常に役立ちます。以下は、提案に基づいて修正したスクリプトの改訂版です。

#!/bin/bash 

baseUrl="https://somebaseurl/api/v1/auth/login" 
contentTypeJson="Content-Type:application/json" 
credentials="{\"email\": \"[email protected]\", \"password\": \"foo\"}" 
login="$(curl -X POST "$baseUrl" -H "$contentTypeJson" -d "$credentials")" 
echo "${login}" 

response="${login}" 
echo "${response}" 
+0

ありがとう、これがありました! – MaxPower

2

は唯一のシーケンスとしてコマンドを解釈します言葉は、特に引用符を扱わない。シェルが対話型のように引用符を解釈するようにするには、代わりにeval ${login}を使用します。余談として

、bashのは、彼らが実行されているとして、あなたが(代わりにbash script.shまたは./script.shbash -x script.shを使用してスクリプトを実行)コマンドが表示されます-xオプションがあります。これにより、正しく引用されたコマンドが表示され、echoを使用してコマンドを出力するよりも便利です。

関連する問題