堅持在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

實際上,您已經在定界文件中正確放置了雙引號。但最後一個|不是必需的,它會產生語法錯誤。

第一個參數分配給您一個額外的新行,但以下應該可以工作。使用定界文檔:

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("=")'
)

相關內容