Linux
如何設置包含換行符的環境變數?
我正在嘗試將 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}