Убедитесь, что переменная имеет определенное количество пробелов

Убедитесь, что переменная имеет определенное количество пробелов

Я работаю в Bash. Я пытаюсь сделать так, чтобы определенная переменная всегда имела одинаковую длину, 16 символов, независимо от того, что в нее передается.

Я пытался

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

но, кажется, он работает вечно. Кажется, что пробелы не рассматриваются как символы.

Есть ли способ сделать так, чтобы переменная всегда имела длину 16 символов?

EDIT: Я забыл включить важный фрагмент контекста. Я обновил код, чтобы отразить это. Ни одна из переменных, которые будут введены, изначально не больше 6 цифр. Когда я делаю вышеприведенное, это работает бесконечно.

решение1

Что касается обсуждаемого вопроса, то я полагаю, что Дики на верном пути.

В качестве альтернативы, возможно, стоит использовать что-то вроде:

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

Если tвсегда короче 16, в чем вы должны быть полностью уверены, вы можете сделать:

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

Обратите внимание, что он зависнет на не-ASCII символах. Например, тест:

$ 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

(Или более затейливо:

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

)

решение2

Если ваша переменная изначально слишком длинная, она никогда не станет меньше. Это работает для меня (обрезать строку или дополнить ее):

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

Связанный контент