![格式化 shell 脚本输出](https://linux22.com/image/113713/%E6%A0%BC%E5%BC%8F%E5%8C%96%20shell%20%E8%84%9A%E6%9C%AC%E8%BE%93%E5%87%BA.png)
如何使用 固定输出宽度printf
?
这是一个示例脚本:
#!/bin/bash
OK=$(printf '\t%+50s\n' OK)
FAIL=$(printf '\t%+50s\n' FAIL)
for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do
echo "$i $OK"
done
输出:
a OK
aa OK
aaa OK
aaaa OK
aaaaaa OK
aaaaaaaaaaaaaaaaa OK
aaaaaaaaaaaaaaaaaaaaaaaaaa OK
我想要这样的东西:
a OK
aa OK
aaa OK
aaaa OK
aaaaaa OK
aaaaaaaaaaaaaaaaa OK
aaaaaaaaaaaaaaaaaaaaaaaaaa OK
答案1
一个简单的方法:
将您的脚本通过管道传输到column -t
$ script.sh | column -t
a OK
aa OK
aaa OK
aaaa OK
aaaaaa OK
aaaaaaaaaaaaaaaaa OK
aaaaaaaaaaaaaaaaaaaaaaaaaa OK
答案2
使用以下printf
方法获得所需的输出:
#!/bin/bash
for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do
printf '%-50sOK\n' $i
done
脚本输出:
a OK
aa OK
aaa OK
aaaa OK
aaaaaa OK
aaaaaaaaaaaaaaaaa OK
aaaaaaaaaaaaaaaaaaaaaaaaaa OK
OK
- 当静态字符串移动到格式(printf FORMAT [ARGUMENT]
)$i
- 视为printf
论点
答案3
您没有使用格式化输出的工具,并且随着$i
宽度的增加,输出无法对齐。
代替
echo "$i $OK"
和
printf "%-50s %s\n" "$i" "$OK"
(用实际字符串替换“foo”)。
在哪里
50s
是一个固定宽度的 50 个字符的字符串,-
(减号)左对齐字符串。man 3 printf
有关格式字符串的详细信息,请参阅。