Застрял на работе с двойными кавычками внутри 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("=")'
)

Связанный контент