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

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

Я пытался

  • , / path / to / a / shell-script-file? (в сценарии оболочки)
  • Как настроить подсказку bash на centos?
  • Сценарий Bash для извлечения идентификатора сообщения и отправки силы
  • Как сохранить файл изображения в переменной bash?
  • Тест Bash: что делает «= ~»?
  • awk для цикла для каждой строки в файле
  • t=33455 until [[ ${#t} == 16 ]]; do t="${t} " done 

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

    Есть ли способ получить переменную всегда длиной 16 символов?

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

  • Измените все команды bash через программу перед их выполнением
  • Почему возникает ошибка при двойном цитировании одинарных кавычек в скрипте, который запускает удаленную команду SSH?
  • Почему «до» блок спроектирован, так как это всего лишь отрицательная версия `while`?
  • Использование обратного SSH-туннелирования за один шаг вместо двух шагов (с -X)
  • Настройте автозаполнение для первого аргумента, оставьте остальных в покое
  • удаление избыточности из выходных столбцов
  • 2 Solutions collect form web for “Убедитесь, что переменная имеет определенное количество пробелов”

    Что касается вопроса, я думаю, Дики находится на трассе.

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

     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" 

    )

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

     if [[ ${#t} -gt 16 ]] then t="${t:0:16}" else until [[ ${#t} -ge 16 ]] do t="${t} " done fi 
    Linux и Unix - лучшая ОС в мире.