Linux

如何設置包含換行符的環境變數?

  • January 24, 2022

我正在嘗試將 RSA 密鑰設置為環境變數,該環境變數作為文本文件包含換行符。

每當我嘗試從文件中讀取並將其傳遞給環境變數時,它只會在第一行的換行符處停止。我怎樣才能防止這種情況?

請注意,除了 zsh 之外,shell 變數不能儲存任意字節序列。所有其他 shell 中的變數不能包含 NUL 字節。並且使用yash,它們不能包含不形成有效字元的字節。

對於不包含 NUL 字節的文件,在類似 POSIX 的 shell 中,您可以執行以下操作:

var=$(cat file; echo .); var=${var%.}

我們添加 a.\n並去除尾隨以解決去除所有尾隨換行符.的事實。$(...)

上面的內容也適用於zsh包含 NUL 的文件,儘管zsh您也可以使用$mapfile特殊的關聯數組:

zmodload zsh/mapfile
var=$mapfile[file]

在 zsh 或 bash 中,您還可以使用:

{ IFS= read -rd '' var || :; } < file

最多讀取第一個 NUL 字節。除非找到 NUL 字節,否則它將返回非零退出狀態。我們在這裡使用命令組至少能夠在打開文件時告訴錯誤,但我們將無法通過退出狀態檢測讀取錯誤。

請記住在傳遞給其他命令時引用該變數。換行符的預設值是$IFS,因此當在 zsh 以外的類似 POSIX 的 shell 中的列表上下文中不加引號時,會導致變數內容被拆分(更不用說其他字元 of$IFS或萬用字元的其他問題)。

所以:

printf %s "$var"

例如(不是printf %s $var,當然不是除了 split+glob 之外echo $var還會增加’s 問題)。echo


使用非 POSIX 外殼:

伯恩殼:

bourne shell 不支持$(...)表單也不支持${var%pattern}操作符,因此很難實現。一種方法是使用eval和引用:

eval "var='`printf \\' | cat file - | awk -v RS=\\' -v ORS= -v b='\\\\' '
 NR > 1 {print RS b RS RS}; {print}; END {print RS}'`"

有了(t)csh,就更糟了,看那裡

使用rc,您可以使用```(separator){…}`帶有空分隔符列表的命令替換形式:

var = ``(){cat file}

引用自:https://unix.stackexchange.com/questions/369972