POSIX/Bash 用尾随换行符填充变量
POSIX/Bash pad variable with trailing newlines
我有一个变量,里面有一些行,我想用另一个变量中定义的一些换行符来填充它。然而,似乎子外壳可能正在剥离尾随的换行符。我不能只将 '\n' 与 echo -e
一起使用,因为这些行可能已经包含需要按原样打印的转义字符。
我发现我可以使用它打印任意数量的换行符。
n=5
yes '' | sed -n "1,${n}p;${n}q"
但是如果我 运行 在子 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
本质上,我需要一种将多个换行符附加到变量的好方法,然后可以使用 echo 打印该变量。
如果可能的话,我想保持这个 POSIX 合规,但在这个阶段,bash 解决方案也是可以接受的。我还将其用作工具的一部分,我为此设置了一个挑战,即在保持可读性的同时最小化行数和字符数。但是一旦我有了可行的解决方案,我就可以解决这个问题
带有 $( )
或反引号的命令替换将 trim 尾随换行符。所以不要使用它们;使用 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'}
我有一个变量,里面有一些行,我想用另一个变量中定义的一些换行符来填充它。然而,似乎子外壳可能正在剥离尾随的换行符。我不能只将 '\n' 与 echo -e
一起使用,因为这些行可能已经包含需要按原样打印的转义字符。
我发现我可以使用它打印任意数量的换行符。
n=5
yes '' | sed -n "1,${n}p;${n}q"
但是如果我 运行 在子 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
本质上,我需要一种将多个换行符附加到变量的好方法,然后可以使用 echo 打印该变量。
如果可能的话,我想保持这个 POSIX 合规,但在这个阶段,bash 解决方案也是可以接受的。我还将其用作工具的一部分,我为此设置了一个挑战,即在保持可读性的同时最小化行数和字符数。但是一旦我有了可行的解决方案,我就可以解决这个问题
带有 $( )
或反引号的命令替换将 trim 尾随换行符。所以不要使用它们;使用 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'}