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 t
for 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