제 생각에는 매우 간단하다고 생각되는 스크립트가 있습니다.
#!/bin/sh
URL=myserver:9443
myCmd="curl -sS -k -X 'POST' 'https://"
myCmd+=$URL
myCmd+="/SKLM/rest/v1/ckms/accessToken' "
myCmd+="-H 'accept: application/json' "
myCmd+="-H 'Accept-Language: en' "
myCmd+="-H 'Content-Type: application/json' "
myCmd+="-d '{ \"userid\": \"SKLMAdmin\", \"password\": \"XXX\" }'"
echo $myCmd
authTok=$($myCmd)
실행하면 다음과 같은 결과가 나타납니다.
curl -sS -k -X 'POST' 'https://myserver:9443/SKLM/rest/v1/ckms/accessToken' -H 'accept: application/json' -H 'Accept-Language: en' -H 'Content-Type: application/json' -d '{ "userid": "SKLMAdmin", "password": "XXX" }'
curl: (3) URL using bad/illegal format or missing URL
curl: (6) Could not resolve host: application
curl: (6) Could not resolve host: en'
curl: (6) Could not resolve host: application
curl: (3) URL using bad/illegal format or missing URL
curl: (6) Could not resolve host: "SKLMAdmin",
curl: (3) URL using bad/illegal format or missing URL
curl: (6) Could not resolve host: "XXX"
curl: (3) unmatched close brace/bracket in URL position 1:
}'
에코 출력을 잘라서 셸에 붙여넣으면 명령이 제대로 작동하지만 스크립트 내에서 이를 실행하는 줄에 이 문자열 오류가 발생합니다.
스크립트에서 cURL을 사용하는 데 대한 몇 가지 기본 규칙을 위반하고 있다고 생각하지만 그것을 알아낼 수 없는 것 같습니다. URL을 변수(궁극적으로는 사용자 이름과 비밀번호)로 만들어야 하는데 그게 문제인 것 같습니다.
답변1
질문에 bash로 태그를 지정했으므로 bash를 사용할 수 있다고 가정합니다. 이 경우 당신은~해야 한다bash는 배열을 지원하므로 사용하세요. 배열은 명령/명령 매개변수를 저장하는 데 더 나은 선택입니다.
#!/usr/bin/env bash
url=myserver:9443
uri='/SKLM/rest/v1/ckms/accessToken'
#data='{ \"userid\": \"SKLMAdmin\", \"password\": \"XXX\" }'
data=$(jo userid=SKLMAdmin password=XXX)
opts=(
-sSk
-X POST
-H 'accept: application/json'
-H 'Accept-Language: en'
-H 'Content-Type: application/json'
-d "$data"
)
authtok=$(curl "${opts[@]}" "${url}${uri}")
이 배열을 사용하면 각 개별 옵션을 개별적으로 확장할 수 있지만 마치 개별적으로 참조된 것처럼 단어 분리 및 기타 원치 않는 확장을 방지할 수 있습니다.
"${opts[@]}"
다음으로 확장 예정:
'-sSk' '-H' 'accept: application/json' '-H' 'Accept-Language: en' '-H' 'Content-Type: application/json' '-d' '{ \"userid\": \"SKLMAdmin\", \"password\": \"XXX\" }'