Linux 스크립트에서 컬을 사용하는 데 문제가 있습니다.
#!/bin/bash 사용자 이름="사용자"; 비밀번호 = "비밀번호"; TenantName = "테넌트"; commande="curl -X POST -H \"콘텐츠 유형: 애플리케이션/json\" -H \"캐시 제어: 캐시 없음\" -H \"우체부 토큰: 111131da-8254-21b3-1b95-9c12954152c9\" -d '{\"auth\":{\"tenantName\":\"$tenantName\",\"passwordCredentials\": {\"사용자 이름\":\"$userName\",\"비밀번호\":\"$passWord\"}}}' \"http://controller:5000/v2.0/tokens\""
commande 변수의 출력을 셸에 복사하여 붙여넣으면 작동하지만 다음을 사용할 때:
res= $(평가 $명령) #또는 res=`$commande`
이 명령 중 어느 것도 작동하지 않습니다. 이것은 일반적으로 발생하는 출력 오류입니다.
11행: {"access":: 명령을 찾을 수 없음
추신: 만약 내가 그렇게 한다면
에코 $ 명령
그런 다음 결과를 쉘에 복사했고 작동했습니다. 누구든지 나를 도울 수 있다면 좋을 것입니다!
답변1
변수는 코드용이 아니라 데이터용입니다. 함수를 정의합니다. 이는 또한 귀하의 제안을 단순화합니다.
#!/bin/bash
userName="user"
passWord="password"
tenantName="tenant"
commande () {
curl -X POST \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Postman-Token: ..." \
-d@- \
http://controller:5000/v2.0/tokens <<EOF
{
"auth": {
"tenantName": "$tenantName",
"passwordCredentials": {
"username": "$userName",
"password": "$password"
}
}
}
EOF
}
위의 내용은 인용을 더욱 단순화하기 위해 문자열에 포함하는 대신 여기 문서에서 JSON을 읽습니다(표준 입력에서 @-
옵션 인수 읽기 ).-d
userName
passWord
그러나 이와 같이 수동으로 JSON을 인코딩하는 것도 , 및 의 값이 JSON으로 올바르게 인코딩되었는지 확인할 수 없는 경우 tennatnName
나쁜 생각입니다 . 더 나은 해결책은 이와 같은 것을 사용하여 jq
올바른 JSON을 생성하는 것입니다.
commande () {
json_template='{
auth: {
tenantName: $tn,
passwordCredentials: {
username: $un,
password: $pw
}
}
}'
jq -n --arg un "$userName" \
--arg pw "$passWord" \
--arg tn "$tenantName" "$json_template" |
curl -X POST
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Postman-Token: ..." \
-d@- \
http://controller:5000/v2.0/tokens
}