带有尾随换行符的 POSIX/Bash pad 变量

sco*_*855 1 bash shell posix echo subshell

我有一个变量,其中有一些行,我想用另一个变量中定义的许多换行符填充它。然而,子外壳似乎正在剥离尾随的换行符。我不能只使用 '\n' ,echo -e因为这些行可能已经包含需要按原样打印的转义字符。

我发现我可以使用它打印任意数量的换行符。

n=5
yes '' | sed -n "1,${n}p;${n}q"
Run Code Online (Sandbox Code Playgroud)

但是,如果我在子shell 中运行它以将其存储在变量中,则子shell 似乎会去除尾随的换行符。

我可以近似功能,但它很笨拙,并且由于我使用它的方式,我更愿意能够调用echo "$var"甚至将$var其自身用于诸如字符串连接之类的事情。一旦删除了变量的最后一行(填充符),这种近似就会遇到与子外壳相同的问题。

这是我的近似值

n=5
var="test"
#I could also just set n=6
cmd="1,$((n+1))p;$((n+1))q"
var="$var$(yes '' | sed -n $cmd; echo .)"

#Now I can use it with
echo "$var" |  head -n -1
Run Code Online (Sandbox Code Playgroud)

本质上,我需要一种将许多换行符附加到变量的好方法,然后可以使用 echo 打印该变量。

如果可能的话,我想保持这个 POSIX 兼容,但在这个阶段,bash 解决方案也是可以接受的。我还将它用作工具的一部分,为此我设定了一个挑战,即在保持可读性的同时最小化行数和字符数。但是一旦我有了可行的解决方案,我就可以解决这个问题

Gor*_*son 5

带有$( )或反引号的命令替换将修剪尾随的换行符。所以不要使用它们;使用 shell 的内置字符串操作:

n=5
var="test"
while [ "$n" -gt 0 ]; do
    var="$var
"
    n=$((n-1))
done
Run Code Online (Sandbox Code Playgroud)

请注意,在var="$var(换行之前)之后不能有任何东西",下一行的之前不能有任何东西(没有缩进!)。