BashのcURLリクエスト

BashのcURLリクエスト

Bashで2つのカール要求を実行するスクリプトを作成しようとしています。これは私のコードです。

#!/bin/bash

ipadd="192.168.1.1"
start_url="http://$ipadd/startPlayer"
stop_url="http://$ipadd/stopPlayer"
header1="Accept: application/json"
header2="Content-Type: application/json"
stp="28508ab5-9591-47ed-9445-d5e8e9bafff6"

function start_player {
        curl --verbose -H \"${header1}\" -H \"${header2}\" -X PUT -d '{\"id\": \"$stp\"}' ${start_url}
}

function stop_player {
        curl -X PUT $stop_url
}

stop_player
start_player

stop_player機能は問題なく機能しますが、最初の機能は機能しません。次のCURLリクエストを実行したいと思います。curl --verbose -H "Accept: application/json" -H "Content-Type: application/json" -X PUT -d '{"id": "c67664db-bef7-4f3e-903f-0be43cb1e8f6"}' http://192.168.1.1/startPlayerstart_player関数をエコーすると出力は予想と正確に一致しますが、start_player関数を実行するとエラーが発生しますCould not resolve host: application。私はこれがbashがヘッダを分割するためだと思いますが、なぜechoではうまくいきますが、bashではうまくいきませんか?

答え1

あなたは次のように書きました:

curl --verbose -H \"${header1}\" -H \"${header2}\" ...

しかし、あなたが本当に欲しいようです:

curl --verbose -H "${header1}" -H "${header2}" ...

header1に設定した値を使用してください。前者は、、、、、、、引数で受け取りheader2、各ヘッダ値が独自のトークンになるようにしたいがエスケープされていない二重引用符がそのトークンを提供します。curl--verbose-H"Accept:application/json"-H"Content-Type:application/json"

そして合格されたようですね-d '{\"id\": \"$stp\"}'。そこに行きたいかもしれません-d "{\"id\": \"$stp\"}"


なぜwhingがechoではうまくいきますが、bashではうまくいかないのかという質問については、実際にはechoの状況はあまり良くなく、その事実を確認するのが難しくなるだけです。

比較する:

$ h1='Accept: foo'; h2='Content-Type: bar'

## Looks good, is actually wrong:
$ echo curl -H \"$h1\" -H \"$h2\"
curl -H "Accept: foo" -H "Content-Type: bar"

## If we ask printf to print one parameter per line:
$ printf '%s\n' curl -H \"$h1\" -H \"$h2\"
curl
-H
"Accept:
foo"
-H
"Content-Type:
bar"

そして:

## Looks different from the bash command, is actually right:
$ echo curl -H "$h1" -H "$h2"
curl -H Accept: foo -H Content-Type: bar

## This is more obvious if we ask printf to print one parameter per line:
$ printf '%s\n' curl -H "$h1" -H "$h2"
curl
-H
Accept: foo
-H
Content-Type: bar

関連情報