Assegure-se de que uma variável tenha um certo número de espaços

1

Estou trabalhando no Bash. Estou tentando fazer com que uma variável específica tenha sempre o mesmo comprimento, 16 caracteres, independentemente do que é passado para ela.

Eu tentei

t=33455
until [[ ${#t} == 16 ]]; do
t="${t} "
done

mas parece que corre para sempre. Parece que os espaços não são tratados como personagens.

Existe alguma maneira de obter a variável sempre com 16 caracteres?

EDIT: eu esqueci de incluir um pouco de contexto importante. Eu atualizei o código para refletir. Nenhuma das variáveis que serão colocadas tem mais de 6 dígitos inicialmente. Quando faço o acima, ele é executado infinitamente.

    
por mkingsbu 15.02.2016 / 21:54

2 respostas

2

Quanto ao problema em questão, acho que o Dickey está na pista.

Como alternativa, talvez use algo como:

t="$(printf "%-16.16s" "$t")"

Se t for sempre menor que 16, o que você precisa ter certeza, você pode fazer:

t="$(printf "%-16s" "$t")"

Note que ele irá travar em caracteres não-ASCII. Por exemplo, teste:

$ x=123
$ x="$(printf "%-16.16s" "$x")"
$ printf "|%s|\n|1234567890123456|789012\n" "$x"
|123             |
|1234567890123456|789012

$ x=12345678901234567890123456
$ x="$(printf "%-16.16s" "$x")"
$ printf "|%s|\n|1234567890123456|789012\n" "$x"
|1234567890123456|
|1234567890123456|789012

$ x=sadasdæøåsasd
$ x="$(printf "%-16.16s" "$x")"
$ printf "|%s|\n|1234567890123456|789012\n" "$x"
|sadasdæøåsasd|                                     <<<--- ups!
|1234567890123456|789012

( Ou o mais chique:

printf "\e[41m%s\e[0m\n\e[41m1234567890123456\e[0m789\n" "$x"

    
por 15.02.2016 / 22:35
1

Se sua variável começou por muito tempo, ela nunca ficará menor. Isso funciona para mim (truncar a string ou preenchê-la):

if [[ ${#t} -gt 16 ]]
then
    t="${t:0:16}"
else
    until [[ ${#t} -ge 16 ]]
    do
        t="${t} "
    done
fi
    
por 15.02.2016 / 22:16