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

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

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

tentei

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

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

Existe alguma maneira de fazer com que a variável tenha sempre 16 caracteres?

EDIT: esqueci de incluir um contexto importante. 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 funciona infinitamente.

Responder1

Quanto ao assunto em questão, acho que Dickey está no caminho certo.

Como alternativa, talvez use algo como:

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

Se tfor sempre menor que 16, do qual você deve ter certeza absoluta, você poderia fazer:

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

Observe que ele 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 sofisticado:

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

)

Responder2

Se sua variável começar muito longa, 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

informação relacionada