Shell

如何在(POSIX)shell變數中正確儲存換行符?

  • September 8, 2018

更新嘗試澄清更多,使用範例,執行以下 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}"

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