我在 bash 脚本中回显一些文本,其中包含一个变量,并且想要填充该变量,以便它始终在右侧有适当数量的空格以保持文本的其余部分对齐。
这是我想要的示例:
Echoing random number 1080 [ OK ]
Echoing random number 443 [ OK ]
Echoing random number 34842 [ OK ]
数值的长度会有所不同(可能不超过 5 或 6 位数字)。
我知道 printf 可以做到这一点,并通过执行以下操作右对齐变量:
printf "Echoing random number %5s [ OK ]" $RAND_NUM
但是,这会将文本格式化为如下所示:
Echoing random number 1080 [ OK ]
Echoing random number 443 [ OK ]
Echoing random number 34842 [ OK ]
当然,仅仅与空格相呼应是行不通的:
echo "Echoing random number ${RAND_NUM} [ OK ]"
产生这个:
Echoing random number 1080 [ OK ]
Echoing random number 443 [ OK ]
Echoing random number 34842 [ OK ]
有没有办法像我的第一个例子一样打印文本?
使用
-
左对齐字段。
printf "Echoing random number %-5s [ OK ]" $RAND_NUM
或者,如果您使用的是 Red Hat Linux 系统,则有预定义的函数可以打印出绿色 OK 和红色 FAILED 提示(您在启动过程中看到的提示):
#!/bin/bash
. /etc/init.d/functions
echo -n "Frobbing widget:"
frob_widget && echo_success || echo_failure
echo
将所有行收集在一个 var 或文本文件中,然后通过
column
命令进行管道传输。
所以这个(我的示例文件/tmp/columns.txt
)
Echoing random number 1080 [ OK ]
Echoing random number 44332356 [ OK ]
Echoing random number 34842 [ OK ]
Echoing random number 342 [ OK ]
变成了这样
Echoing random number 1080 [ OK ]
Echoing random number 44332356 [ OK ]
Echoing random number 34842 [ OK ]
Echoing random number 342 [ OK ]
命令示例:
cat /tmp/columns.txt | column -t
简单的标准 Bash 函数($1:要填充的字符串;$2:整数填充长度,左填充为正,右填充为负):
function pad () { [ "$#" -gt 1 ] && [ -n "$2" ] && printf "%$2.${2#-}s" "$1"; }
使用示例:
$ echo "!$(pad "foobar" 9)!"
! foobar!
$ echo "!$(pad "foobar" -9)!"
!foobar !
$ echo "!$(pad "foobar" 3)!"
!foo!
扩展 sobi3ch 的答案:如果您使用分隔符连接字符串(我使用 tilda (~)),则可以使用 -s 参数调用 column 来在该点拆分文本。
对虐待猫科动物表示歉意:
foo.txt :
Echoing random number 1080~[ OK ]
Echoing random number 1080~[ OK ]
Echoing random number 1080~[ Failed ]
然后:
cat foo.txt | column -s'~'
Echoing random number 1080 [ OK ]
Echoing random number 1080 [ OK ]
Echoing random number 1080 [ Failed ]
# Padding with spaces:
x_padded=" $x"
x_padded=${x_padded: -3}
# Padding with zeros:
x_padded="000$x"
x_padded=${x_padded: -3}