heredoc 내에서 큰따옴표 작업이 중단되었습니다.

heredoc 내에서 큰따옴표 작업이 중단되었습니다.

이 코드를 실행하려고 합니다.

    while read Item; do
        export environmentVariables="$environmentVariables\n      - $Item"
    done <<< "$(
        cat /LocalSecrets/EnvironmentVariables.json |
        jq -r 'to_entries[] | "\(.key)=\(.value)"' |
    )"

에 간단한 JSON 파일이 있습니다 /LocalSecrets/EnvironmentVariables.json. 이는 간단한 키/값 쌍 JSON 개체입니다.

{
    "FirstKey": "FirstValue",
    "SecondKey": "SecondValue",
    "ThirdKey": "ThirdValue"
}

jq그리고 다음과 같은 쉘 변수를 사용하여 읽고 추가하고 싶습니다 $environmentVariables.

FirstKey=FirstValue
SecondKey=SecondValue
ThirdKey=ThirdValue

그러나 명령에 큰따옴표가 필요하고 루프의 현재 셸을 jq유지하기 위해 heredoc을 사용해야 하기 때문에 막혔습니다. $environmentVariables해당 코드는 실행되지 않으며 구문 오류가 있습니다.

어떻게 해야 하나요? 다른 솔루션도 열려 있습니다.

답변1

실제로 heredoc 내에 큰따옴표를 올바르게 배치했습니다. 그러나 마지막은 |필요하지 않으며 구문 오류가 발생합니다.

첫 번째 매개변수 할당은 추가 줄 바꿈을 제공하지만 다음은 작동합니다. heredoc 사용:

while read item; do
    export environmentVariables="$environmentVariables\n$item"
done <<< "$(
    cat /LocalSecrets/EnvironmentVariables.json |
    jq -r 'to_entries[] | [.key, .value] | join("=")'
)"

동일하지만 프로세스 대체를 사용합니다.

while read item; do
    export environmentVariables="$environmentVariables\n$item"
done < <(cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")')

<(commands)~이다프로세스 대체, 명령 실행 결과는 특수 파일 이름으로 나타나며 while간단한 입력 리디렉션을 통해 전달됩니다 <.

또는 간단한 파이프를 사용하지만 while현재 쉘 환경에서 마지막 요소( )를 실행하도록 쉘에 지시하여 변수 값을 보존할 수 있습니다.

shopt -s lastpipe
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")' |
while read item
do
    export environmentVariables="$environmentVariables\n$item"
done

또한 변수에 문자 그대로 문자가 아닌 개행 문자가 실제로 필요한 경우 다음을 \n수행하면 됩니다.

export environmentVariables=$(
    cat /LocalSecrets/EnvironmentVariables.json |
    jq -r 'to_entries[] | [.key, .value] | join("=")'
)

관련 정보