2015-03-13 52 views
1

我目前有一个bash脚本,它检查一些依赖关系,然后执行一些生成pdf的代码。右对齐bash输出与周期

此刻,当相关性检查我的输出是这样的:

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

依赖名称和行之间的周期数是硬编码。因此,运行不同版本的脚本的任何人都会错误地证明OK正确如下。

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

我想,这可能是最简单的创造,它传递依赖的名义,一个单独的函数,如果它好不好。该功能然后打印出名称,点数和OK或NOK。

我磕磕绊绊的是如何执行点数,如果有一个更简单的方法来做到这一点。

+0

只需使用['printf'](http://stackoverflow.com/a/4410103/477563) – 2015-03-13 16:20:18

回答

1

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

+0

尽管所有其他答案似乎都提供了工作解决方案,但我选择实施此变体:https://gist.github.com/TheMightyLlama/261b296d66b3a042b743 – TheMightyLlama 2015-03-13 16:32:41

+0

@ TheMightyLlama:你并不需要那么长的代码。而不是'maxlen = 80',只需在下面的答案中替换'maxlen = $(tput cols)'并获得相同的输出。 – anubhava 2015-03-13 16:38:33

1

printf是在击

可用要在数字和字符串的输出更加灵活,printf命令允许格式改性剂。这些介绍%和指定格式的字符之间指定:

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

我看到'printf'BashVersion%50s \ n“”OK“'给了我正确的输出减去句点。我可以用\ n \来替换\ n吗? – TheMightyLlama 2015-03-13 15:51:35

+0

[是的,你可以。](http://stackoverflow.com/a/4410103/477563) – 2015-03-13 15:54:59

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" 
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