Estoy trabajando en Bash. Estoy tratando de lograr que una variable en particular tenga siempre la misma longitud, 16 caracteres, independientemente de lo que se le pase.
Lo intenté
t=33455
until [[ ${#t} == 16 ]]; do
t="${t} "
done
pero parece correr para siempre. Parecería que los espacios no son tratados como personajes.
¿Hay alguna forma de hacer que la variable tenga siempre 16 caracteres?
EDITAR: Olvidé incluir un contexto importante. Actualicé el código para reflejar. Ninguna de las variables que se introducirán tiene más de 6 dígitos inicialmente. Cuando hago lo anterior, se ejecuta infinitamente.
Respuesta1
En cuanto al tema que nos ocupa, supongo que Dickey está en el buen camino.
Como alternativa, quizás utilice algo como:
t="$(printf "%-16.16s" "$t")"
Si t
siempre es menor que 16, de lo cual debes estar completamente seguro, puedes hacer:
t="$(printf "%-16s" "$t")"
Tenga en cuenta que fallará en caracteres que no sean ASCII. Por ejemplo, prueba:
$ 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
( O el más elegante:
printf "\e[41m%s\e[0m\n\e[41m1234567890123456\e[0m789\n" "$x"
)
Respuesta2
Si su variable comenzó demasiado larga, nunca se hará más pequeña. Esto funciona para mí (trunca la cadena o rellénala):
if [[ ${#t} -gt 16 ]]
then
t="${t:0:16}"
else
until [[ ${#t} -ge 16 ]]
do
t="${t} "
done
fi