右对齐bash输出与句点

时间:2015-03-13 15:43:21

标签: bash

我目前有一个bash脚本,它检查一些依赖项,然后执行一些生成pdf的代码。

在检查依赖项时,我的输出如下所示:

CHECKING DEPENDENCIES:
4.3.33(1)-release.................................OK
wkhtmltopdf 0.12.1 (with patched qt)..............OK
jq-1.4............................................OK

依赖项名称和OK之间的句点数是硬编码的。因此,运行具有不同版本的脚本的任何人都将OK错误地对齐,如下所示。

CHECKING DEPENDENCIES:
4.3.33(1)-release.................................OK
wkhtmltopdf 0.11.0..............OK
jq-1.4............................................OK

我认为创建一个单独的函数可能是最简单的,该函数传递了依赖项的名称,如果它没有问题。然后该功能打印出名称,点数和OK或NOK。

我磕磕绊绊的是如何执行该点数,以及是否有更简单的方法。

4 个答案:

答案 0 :(得分:2)

您可以将此纯BASH实用程序用于格式化输出:

# max width of your terminal
maxlen=$(tput cols)

# initialize a string with $maxlen dots
printf -v fill "%${maxlen}s" ""
fill="${fill// /.}"

# function for printing it 
printfmt() { printf '%s%0.'$(($maxlen - ${#1} - ${#2} ))'s%s\n' "$1" "$fill" "$2"; }

<强>测试

printfmt "wkhtmltopdf 0.11.0 foo bar baz" "OK"
wkhtmltopdf 0.11.0 foo bar baz................................................OK
printfmt "wkhtmltopdf 0.11.0 foo bar" "NOK"
wkhtmltopdf 0.11.0 foo bar...................................................NOK
printfmt "wkhtmltopdf 0.11.0" "OK"
wkhtmltopdf 0.11.0............................................................OK

答案 1 :(得分:1)

tput cols(显示每行字符数)是您正在寻找的。使用它,您可以通过减去单词来轻松找出需要添加的点数。

答案 2 :(得分:1)

printf在Bash中可用

为了更灵活地输出数字和字符串,printf命令允许使用格式修饰符。这些是在介绍性%和指定格式的字符之间指定的:

printf "%50s\n" "This field is 50 characters wide..."

答案 3 :(得分:1)

这种方式有点作弊,因为它会覆盖行,所以如果你在文件中捕获输出,它看起来不会很好看。但它适用于显示目的:

dotfmt=$(printf .%.0s {1..50})%s$(tput cr)%s\\n
#for each dependency:
# ...
  printf dotfmt "$ok" "$name" 

更清洁的解决方案是计算点数。

printf %s "$name"
if ((${#name} < 50)); then
  printf .%.0s $(seq $((50-${#name})))
fi
echo "$ok"