更新尝试澄清更多,使用示例,执行以下 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>
)。但这只是我。命令替换确实去除了尾随的换行符,但只有那些。解决方法是确保最后一个字符不是换行符,然后删除该字符。
这两个都应该给你一个换行符: