格式化 shell 脚本输出

格式化 shell 脚本输出

如何使用 固定输出宽度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有关格式字符串的详细信息,请参阅。

相关内容