如何使用 \n 作为分隔符将数据附加到变量?

如何使用 \n 作为分隔符将数据附加到变量?

新行字符似乎丢失了,即使它们出现在引号内。

foo=
for i in 1 2 3; do
    foo="$foo$(printf '\n')$i"
done

echo "$foo"
123

现在在实践中,我不想\n在第一个元素之前添加 a,所以我会使用 a${foo:+$(printf '\n')}代替,但首先我必须弄清楚为什么上面的代码不起作用。

答案1

命令替换会删除尾随换行符,因此$(printf '\n')与 相同$(printf '\n\n\n\n'),即空字符串。

要在字符串中包含换行符,请将其放在单引号或双引号之间。

for i in 1 2 3; do
  foo="$foo
$i"
done

您可能会发现定义一个变量来存储换行符并不那么难看。

nl='
'
for i in 1 2 3; do
  foo="$foo$nl$i"
done

在 ksh93、bash、FreeBSD sh、mksh 和 zsh 中,但还不是普通的 sh,您还可以使用美元单引号,它允许反斜杠转义。

for i in 1 2 3; do
  foo="$foo"$'\n'"$i"
done

答案2

是的,换行符丢失了,命令替换 他们:

shell 应通过在子 shell 环境中执行命令(请参阅 Shell 执行环境)并用命令的标准输出替换命令替换(命令文本加上封闭的“$()”或反引号)来扩展命令替换,删除替换末尾的一个或多个 < newline > 字符的序列

您不需要循环for,只需:

foo=$(printf '%s\n' 1 2 3)

相关内容