如何在 (POSIX) 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

原始问题表述

存储 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}"

相关内容