Shell
如何在(POSIX)shell變數中正確儲存換行符?
更新嘗試澄清更多,使用範例,執行以下 shell 命令:
SHELLVARIABLE="1st line, 2nd line, 3rd line, " printf '%s' "$SHELLVARIABLE"
生成此輸出:
1st line,<newline>2nd line,<newline>3rd line,<newline>
<newline>
作為角色0x0a
/\n
?原始問題表述
將換行符
0x0a
(又名以其 commen c 樣式 escap 已知\n
)儲存到 shell 變數中的正確(POSIX 確認)方法是什麼。我想確保執行以下操作:
SHELLVARIABLE=" "
是,不僅是偶然的工作,而且確實是正確的方法。
由於 POSIX 的printf完全能夠生成換行符(即
printf '\n'
,或printf '%b' '\0012'
),我首先嘗試了更明確的(?或正確?)形式:SHELLVARIABLE="$(printf '\n')"
雖然是一種誘人的方法,但不起作用。根據標準,命令替換(即通過
$()
和)應刪除
替換結束時的一個或多個換行符的序列。
注意:要求將單個尾隨換行符儲存到 shell 變數中只是為了抽象更一般的案例(我確實尋求答案),即如何將字元串儲存到以換行符結尾的 POSIX shell 變數中。
在帶引號的字元串中使用硬換行符很好。
儘管就個人而言,如果您只想要換行符,我會避免使用它:我發現它看起來很奇怪,並且在第一行的末尾意外碰到額外空格的風險很小(所以您會得到 eg
<space><newline>
)。但這只是我。命令替換確實去除了尾隨的換行符,但只有那些。解決方法是確保最後一個字元不是換行符,然後刪除該字元。
這兩個都應該給你一個換行符:
nl1=' ' nl2="$(printf '\nx')" nl2="${nl2%x}"