我正在尝试运行此代码:
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
并将它们全部附加到一个 shell 变量中,$environmentVariables
例如:
FirstKey=FirstValue
SecondKey=SecondValue
ThirdKey=ThirdValue
但是由于jq
命令中需要双引号,并且我需要使用 heredoc 来保留$environmentVariables
循环中当前 shell 中的,所以我陷入了困境。该代码无法运行,并且存在语法错误。
我该怎么办?我也愿意接受其他解决方案。
答案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
或者,您可以使用简单的管道,但指示 shell在当前 shell 环境中执行其最后一个元素( ),从而允许保留您的变量值:
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("=")'
)