변수를 사용하여 컬 명령 실행

변수를 사용하여 컬 명령 실행

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

userNamepassWord그러나 이와 같이 수동으로 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
}

관련 정보