如何格式化脚本的输出以具有相同数量的空格

SeH*_*oon 7 bash scripts

这是我的脚本:

#!/bin/bash
declare -a a=(`ls`)
declare -a b=()
declare -a sorted_arr=()

var =0

while [ -n "${a[$var]}" ]
do

    echo "${a[$var]:0:10}              |"
    var=`expr $var + 1`

done
Run Code Online (Sandbox Code Playgroud)

此脚本产生不一致的间距

another_fi              |
f2.txt              |
file1.txt              |
file3.txt              |
Run Code Online (Sandbox Code Playgroud)

我想要的是垂直管道符号对齐

another_fi             |
f2.txt                 |
file1.txt              |
file3.txt              |
Run Code Online (Sandbox Code Playgroud)

Ser*_*nyy 10

主要原因是因为您的 echo 命令从变量中获取 x 个字符并填充 14 个空格。这意味着输出字符串空间中的字符总数将不一致。

相反,您可能希望将printf宽度说明符%-10s用于左填充,如下所示:

bash-4.3$ for i in "${a[@]}"; do     printf "%-10s%-4s|\n"  "${i:0:10}" " "; done
1.wav         |
2.wav         |
3.wav         |
input.txt     |
Run Code Online (Sandbox Code Playgroud)

这样,无论您拥有什么变量,都将使其适合 10 个字符,并且对于这 10 个字符,我们填充 4.-符号使每个字符串左对齐。

Number -10in%-10s应该保持不变,以确保即使文件短于 10 个字符,我们仍然得到一个 10 个字符的字符串,并填充了空格。但%-4s部分可以变化。例如在上面的例子中,%-4s那里会有 4 个空格,但如果我们想要 14 个空格,那么使用%-14s.


请注意,通常建议不要解析 ls 的输出,这正是您正在做的。作为替代方案,我们可以使用find具有如下while IFS= read -r -d ''结构的命令:

bash-4.3$ find -maxdepth 1 -type f -print0 | while IFS= read -r -d '' file;
> do
>     printf "%-10s%-4s|\n"  "${file:0:10}" " "
> done
./3.wav       |
./1.wav       |
./2.wav       |
./.swp        |
./input.tx    |
Run Code Online (Sandbox Code Playgroud)

请注意,这find是递归的,因此它也适用于子目录。如果您想避免这种情况,请使用-maxdepth 1选项。

请注意,它find也有自己的-printf选项,通过一个进程完成所有事情可能比两个更有效(find加上while运行的子shell ):

$ find /bin -type f -printf "%-15f|\n" 2>/dev/null | head -n 5
hostname       |
nc.traditional |
fusermount     |
loadkeys       |
zless          |
Run Code Online (Sandbox Code Playgroud)

理想情况下,我建议将所有内容都写入临时文件,找出最长的行(也就是文件中最长的文件名)并相应地填充您想要的许多空格。