格式化的 shell 脚本输出

Leo*_*tiz 6 shell-script printf text-formatting

如何使用 修复输出宽度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
Run Code Online (Sandbox Code Playgroud)

输出:

a                                                       OK
aa                                                      OK
aaa                                                     OK
aaaa                                                    OK
aaaaaa                                                  OK
aaaaaaaaaaaaaaaaa                                                  OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                                               OK
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西:

a                                                       OK
aa                                                      OK
aaa                                                     OK
aaaa                                                    OK
aaaaaa                                                  OK
aaaaaaaaaaaaaaaaa                                       OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                              OK
Run Code Online (Sandbox Code Playgroud)

Joh*_*ofy 20

一个简单的方法:

将您的脚本通过管道传输到 column -t

$ script.sh | column -t
a                           OK
aa                          OK
aaa                         OK
aaaa                        OK
aaaaaa                      OK
aaaaaaaaaaaaaaaaa           OK
aaaaaaaaaaaaaaaaaaaaaaaaaa  OK
Run Code Online (Sandbox Code Playgroud)


Rom*_*est 19

Use the following printf approach to get the needed output:

#!/bin/bash
for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do
    printf '%-50sOK\n' $i 
done
Run Code Online (Sandbox Code Playgroud)

Script output:

a                                                 OK
aa                                                OK
aaa                                               OK
aaaa                                              OK
aaaaaa                                            OK
aaaaaaaaaaaaaaaaa                                 OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                        OK
Run Code Online (Sandbox Code Playgroud)
  • OK - as static string is moved to the FORMAT (printf FORMAT [ARGUMENT])

  • $i - considered as printf argument


Arc*_*mar 6

You didn't use a tool that formats output and, as $i gets wider, your output fails to align.

Replace

echo "$i $OK"
Run Code Online (Sandbox Code Playgroud)

with

printf "%-50s %s\n" "$i" "$OK"
Run Code Online (Sandbox Code Playgroud)

(replace "foo" by actual string).

where

  • 50s is a fixed width 50 char string,
  • - (minus) left-justify the string.
  • see man 3 printf for details about the format string.