Я пытаюсь запустить этот код:
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("=")'
)