Como formatar a saída do script para ter o mesmo número de espaços

6

Aqui está meu script:

#!/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

Este script produz espaçamento inconsistente

another_fi              |
f2.txt              |
file1.txt              |
file3.txt              |

O que eu quero é que os símbolos de pipeline vertical sejam alinhados

another_fi             |
f2.txt                 |
file1.txt              |
file3.txt              |
    
por SeHoon 08.06.2017 / 15:30

1 resposta

9

A principal razão é porque o comando echo leva x número de caracteres da variável e preenche 14 espaços. Isso significa que o número total de caracteres no espaço da string de saída não será consistente.

Em vez disso, convém usar printf com o especificador de largura %-10s para o preenchimento à esquerda, desta forma:

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

Desta forma, qualquer variável que você tiver será feita para caber dentro de 10 caracteres, e para esses 10 caracteres, nós preencheremos 4. - sign deixa cada string justificada.

O número -10 in %-10s deve permanecer o mesmo para garantir que, mesmo que o arquivo tenha menos de 10 caracteres, ainda recebamos uma cadeia de 10 caracteres com espaços preenchidos. Mas %-4s part pode ser variado. Por exemplo, no exemplo acima, %-4s terá 4 espaços lá, mas se quisermos ter 14 espaços, use %-14s .

Observe que geralmente é recomendado contra a análise de saída de ls , que é exatamente o que você está fazendo. Como alternativa, podemos usar o comando find com while IFS= read -r -d '' estrutura assim:

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    |

Observe que find é recursivo, por isso também funciona em subdiretórios. Se você quiser evitar isso, use a opção -maxdepth 1 .

    
por Sergiy Kolodyazhnyy 08.06.2017 / 16:00

Tags