这是我的脚本:
#!/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
此脚本产生不一致的间距
another_fi |
f2.txt |
file1.txt |
file3.txt |
我想要的是垂直管道符号对齐
another_fi |
f2.txt |
file1.txt |
file3.txt |
答案1
主要原因是您的 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 |
这样,无论您有什么变量,都将适合 10 个字符,并且我们会在这 10 个字符之后填充 4.-
符号使每个字符串左对齐。
-10
中的数字%-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 |
请注意,这find
是递归的,因此它也适用于子目录。如果您想避免这种情况,请使用-maxdepth 1
选项。
请注意,它find
也有自己的-printf
选项,通过一个进程完成所有事情可能比两个进程更有效率(再加上运行find
的子shell while
):
$ find /bin -type f -printf "%-15f|\n" 2>/dev/null | head -n 5
hostname |
nc.traditional |
fusermount |
loadkeys |
zless |
理想情况下,我建议将所有内容写入临时文件,找出最长的行(即文件中最长的文件名)并相应地填充您想要的空格数。