我有一个变量,其中有一些行,我想用另一个变量中定义的一些换行符填充它。然而,子shell似乎正在剥离后面的换行符。我不能只将'\n'与echo -e
一起使用,因为行中可能已经包含需要按原样打印的转义字符。
我发现我可以用这个打印任意数量的换行符。
n=5
yes '' | sed -n "1,${n}p;${n}q"
但是,如果我在子shell中运行它以将其存储在变量中,那么子shell似乎会去掉后面的换行符。
我可以近似该功能,但它很笨拙,而且由于我使用它的方式,我更希望能够只调用echo "$var"
,甚至使用$var
本身来进行字符串串联之类的操作。一旦移除变量的最后一行(填充(,这种近似就会遇到与子shell相同的问题。
这是我的近似
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
从本质上讲,我需要一种很好的方法,将许多换行符附加到一个变量中,然后用echo打印该变量。
如果可能的话,我希望保持这个POSIX兼容,但在现阶段,bash解决方案也是可以接受的。我还将此作为一个工具的一部分,我为其设定了一个挑战,即在保持可读性的同时尽量减少行数和字符数。但一旦我有了可行的解决方案,我就可以解决这个问题
用$( )
或backticks替换命令将修剪尾部换行符。所以不要使用它们;使用shell内置的字符串操作:
n=5
var="test"
while [ "$n" -gt 0 ]; do
var="$var
"
n=$((n-1))
done
请注意,var="$var
之后(换行之前(不得有任何内容,下一行的"
之前不得有任何信息(无缩进!(。
n
换行符序列:
printf -v spaces "%*s" $n ""
newlines=${spaces// /$'n'}