Bash에서 두 개의 컬 요청을 수행하는 스크립트를 작성하려고 합니다. 이것은 내 코드입니다.
#!/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