更新尝试使用示例来澄清更多信息,执行以下 shell 命令:
SHELLVARIABLE="1st line,
2nd line,
3rd line,
"
printf '%s' "$SHELLVARIABLE"
生成此输出:
1st line,<newline>2nd line,<newline>3rd line,<newline>
<newline>
是角色0x0a
/ \n
?
原始问题表述
存储 a 的正确(POSIX 确认)方法是什么新队字符0x0a
(也称为commen c 风格 escap \n
)转换为 shell 变量。
我想确保执行以下操作:
SHELLVARIABLE="
"
是的,这不仅仅是偶然,而是确实是正确的方法。
自从 POSIX 的打印函数完全能够生成换行符(即printf '\n'
, 或printf '%b' '\0012'
) 我首先尝试了更明确的(?或正确的?)形式:
SHELLVARIABLE="$(printf '\n')"
虽然这是一种诱人的方法,但不是工作。正如根据标准,命令替换(即通过$()
和` `
)应删除
一个或多个的序列新队s 在替换的末尾。
注意:要求将单个尾随换行符存储到 shell 变量中只是为了抽象更一般的用例(我确实寻求答案),即如何将字符串存储到 POSIX shell 变量中,该变量以新队特点。
答案1
在带引号的字符串中使用硬换行符是可以的。
虽然就我个人而言,如果您只想要换行符,我会避免使用它:我发现它看起来很奇怪,并且存在意外在第一行末尾击中额外空格的轻微风险(因此您会得到eg <space><newline>
)。但这只是我。
命令替换确实会剥离尾随换行符,但仅限这些。解决方法是确保最终字符不是换行符,然后删除该字符。
这两个都应该给你一个换行符:
nl1='
'
nl2="$(printf '\nx')"
nl2="${nl2%x}"