Вот мой сценарий:
#!/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 |
Основная причина в том, что ваша команда 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
плюс подоболочка, в которой работает while
):
$ find /bin -type f -printf "%-15f|\n" 2>/dev/null | head -n 5
hostname |
nc.traditional |
fusermount |
loadkeys |
zless |
В идеале я бы предложил записать все во временный файл, вычислить самую длинную строку (или самое длинное имя файла в файле) и заполнить столько пробелов, сколько вы хотите, соответственно. [Тысяча сто двадцать семь]