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/startPlayer
start_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