无法在 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并将它们全部附加到一个 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("=")'
)

相关内容