新行字符似乎丢失了,即使它们出现在引号内。
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)