더 큰 json 객체의 변수로 json 문자열에 대한 bash 변수 대체

더 큰 json 객체의 변수로 json 문자열에 대한 bash 변수 대체

bash 변수와 함께 AWS cli가 제대로 작동하도록 할 수 없습니다. AWS cli 명령은 JSON 문자열을 매개변수로 허용합니다. 하지만 이 json 문자열에서 내가 사용하는 변수 $SCHEMA_DEFINITION자체는 JSON 문자열입니다. 어떤 이유로 $SCHEMA_DEFINITIONJSON에서 큰따옴표가 제거되어 유효하지 않게 되었습니다. 이러한 참조를 보존하고 유효한 AWS 명령을 생성하려면 어떻게 해야 합니까?

aws glue create-schema --cli-input-json '{"RegistryId": {"RegistryName": "hxp-schema-registry"},"SchemaName": "'$modelClassName'","DataFormat": "AVRO","Compatibility": "FULL_ALL","SchemaDefinition": "'"$SCHEMA_DEFINITION"'"}'

오류가 발생합니다.

An error occurred (InvalidInputException) when calling the CreateSchema operation: Schema definition of AVRO data format is invalid: Unexpected character ('n' (code 110)): was expecting double-quote to start field name
 at [Source: (String)"{name:hello}"

변수를 설정하는 방법은 다음과 같습니다.SCHEMA_DEFINITION={"name":"Hello"}

답변1

생성하려는 JSON에는 키 값으로 JSON 문자열로 인코딩된 JSON 개체가 포함되어 있어야 합니다 SchemaDefinition. 또한 modelClassName쉘 변수의 값을 key 값으로 포함 시키려는 것 같습니다 SchemaName.

jq다음을 사용하여 JSON을 생성할 수 있습니다.

json=$(
    jq -n -c \
        --arg SchemaName "$modelClassName" \
        --arg SchemaDefinition '{"name": "Hello"}' \
        '{"RegistryId":{"RegistryName":"hxp-schema-registry"},"DataFormat":"AVRO","Compatibility":"FULL_ALL"} + $ARGS.named'
)

또는 더 쉽게 읽을 수 있도록

json=$(
    jq -n -c \
        --arg SchemaName "$modelClassName" \
        --arg SchemaDefinition '{"name": "Hello"}' '
    {
      "RegistryId": {
        "RegistryName": "hxp-schema-registry"
      },
      "DataFormat": "AVRO",
      "Compatibility": "FULL_ALL"
    } + $ARGS.named'
)

심지어,

schema_json=$(
    jq -n -c --arg name 'hello' '$ARGS.named'
)

json=$(
    jq -n -c \
        --arg SchemaName "$modelClassName" \
        --arg SchemaDefinition "$schema_json" '
    {
      "RegistryId": {
        "RegistryName": "hxp-schema-registry"
      },
      "DataFormat": "AVRO",
      "Compatibility": "FULL_ALL"
    } + $ARGS.named'
)

이는 스키마 정의 JSON 개체 및 모델 클래스 이름을 JSON 문자열로 올바르게 인코딩하고 이를 JSON 문서의 적절한 위치에 삽입합니다.

그런 다음 명령을 호출하십시오.

aws glue create-schema --cli-input-json "$json"

답변2

껍질이 당신의 제안을 먹고 있습니다. 따옴표는 쉘에 특별하므로 공백과 같은 다른 특수 문자를 보호해야 합니다.

$ var=aaa bb cc
bash: bb: command not found
terdon@tpad ~ $ var="aaa bb cc"
terdon@tpad ~ $ echo "$var"
aaa bb cc

따라서 귀하의 경우 쉘은 값을 엄격하게 보호한다고 생각하므로 값을 변수 값의 일부로 저장하지 않습니다.

$ SCHEMA_DEFINITION={"name":"Hello"}
$ echo "$SCHEMA_DEFINITION"
{name:Hello}

하지만 걱정하지 마세요. 쉬운 해결책이 있습니다! 변수 정의 주위에 작은따옴표를 사용할 수 있습니다.

$ SCHEMA_DEFINITION='{"name":"Hello"}'
$ echo "$SCHEMA_DEFINITION"
{"name":"Hello"}

또는 따옴표를 이스케이프 처리할 수 있습니다.

$ SCHEMA_DEFINITION={\"name\":\"Hello\"}
$ echo "$SCHEMA_DEFINITION"
{"name":"Hello"}

printf또는 내장된 명령을 사용할 수 있습니다 .

$ printf -v SCHEMA_DEFINITION '{"%s":"%s"}' "name" "Hello"
$ echo "$SCHEMA_DEFINITION"
{"name":"Hello"}

아니면 당신은 사용할 수 있습니다jo(1)유용:

SCHEMA_DEFINITION=$(jo name=hello)

먼저 모든 것을 변수로 구축하는 것이 좋습니다.

schema_definition='{"name":"Hello"}'
modelClassName='"thisModel"'
json_string='{"RegistryId": {"RegistryName": "hxp-schema-registry"},"SchemaName":'
json_string="$json_string $modelClassName"
json_string="$json_string"' "DataFormat": "AVRO","Compatibility": "FULL_ALL","SchemaDefinition": '"$schema_definition"

결과 :

$ echo "$json_string"
{"RegistryId": {"RegistryName": "hxp-schema-registry"},"SchemaName": "thisModel" "DataFormat": "AVRO","Compatibility": "FULL_ALL","SchemaDefinition": {"name":"Hello"}

이제 다음을 수행할 수 있습니다.

aws glue create-schema --cli-input-json "$json_string"

답변3

Terdon이 맞습니다. json 변수가 잘못 설정되었지만 명령에 잘못 전달하고 있습니다.

귀하는 다음을 통과하고 있습니다:

{
    "RegistryId": {
        "RegistryName": "hxp-schema-registry"
    },
    "SchemaName": "'$modelClassName'",
    "DataFormat": "AVRO",
    "Compatibility": "FULL_ALL",
    "SchemaDefinition": "'"$SCHEMA_DEFINITION"'"
}

이는 다음으로 확장됩니다.

{
    "RegistryId": {
        "RegistryName": "hxp-schema-registry"
    },
    "SchemaName": "'$modelClassName'",
    "DataFormat": "AVRO",
    "Compatibility": "FULL_ALL",
    "SchemaDefinition": "{"name":"Hello"}"
}

주의하세요 "{"name":"Hello"}".

이에 대해서는 heredoc을 사용하는 것이 좋지만 어느 쪽이든 {}.

read -rd json <<EOF
{
    "RegistryId": {
        "RegistryName": "hxp-schema-registry"
    },
    "SchemaName": "$modelClassName",
    "DataFormat": "AVRO",
    "Compatibility": "FULL_ALL",
    "SchemaDefinition": $SCHEMA_DEFINITION
}
EOF

아니면 jo(1)을 사용하세요:

json=$(jo RegistryId=$(jo RegistryName=hxp-schema-registry) \
SchemaName=$modelClassName \
DataFormat=AVRO \
Compatibility=FULL_ALL \
SchemaDefinition=$SCHEMA_DEFINITION)

그런 다음 변수를 사용하여 명령을 호출할 수 있습니다.

aws glue create-schema --cli-input-json "$json"

나는 또한 추천한다https://jsonlint.com/이러한 문제가 발생하면 json 입력을 확인하세요.

관련 정보