![保存到变量时如何保持 printf 中的宽度格式?](https://linux22.com/image/193125/%E4%BF%9D%E5%AD%98%E5%88%B0%E5%8F%98%E9%87%8F%E6%97%B6%E5%A6%82%E4%BD%95%E4%BF%9D%E6%8C%81%20printf%20%E4%B8%AD%E7%9A%84%E5%AE%BD%E5%BA%A6%E6%A0%BC%E5%BC%8F%EF%BC%9F.png)
我有以下代码
printf "%8s.%s\n" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM"
这会产生预期的输出
24756.22971
9910.13045
7701.30924
22972.27622
我想将此输出与前导空格保存在变量中以供以后使用,如下所示
printf -v output "%8s.%s\n" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM"
但是,如果我尝试打印/回显变量 $output,前导空格就会消失:
24756.22971
9910.13045
7701.30924
22972.27622
答案1
我猜您正在使用不带引号的变量output
,如
printf '%s\n' $output
这将使 shell 在空格(默认情况下为空格、制表符和换行符)上拆分变量中的字符串,即删除前导缩进。您仍然会从中得到四行输出,只是因为printf
每个单词都重复使用了格式字符串。
使用echo $output
,您可以在一行上获取数据,因为它的作用是echo
,它输出每个参数(字符串中的拆分单词),参数之间有空格。
相反,请确保您双引号的扩展$output
:
printf '%s' "$output"
(我没有\n
在此处放入格式字符串,因为这会在字符串末尾输出一个空行,因为它已经以换行符结尾)。
也可以看看: