Используйте printfдля форматирования вывода (это также более переносимо, чемecho ). Я бы также сохранил реальное значение цветовых escape-последовательностей вместо того, чтобы хранить их в форме, которая требует расширения echo.
RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3)
NC=$(tput sgr0)
online="${GREEN}online$NC" offline="${RED}offline$NC"
ping -c 1 "$hostname" > /dev/null 2>&1 && state=$online || state=$offline
printf 'Network %-15s: %s\n' "$hostname" "$state"
%-15sявляется спецификация формата , что подушечки строки с пробелами справа , так как длина (в количестве символов в zshи fishи байты в большинстве других оболочек / Printf ) , чтобы быть по крайней мере 15.
$ printf '|%-4s|\n' a ab abc abcd abcde
|a |
|ab |
|abc |
|abcd|
|abcde|
printf '|%4s|\n' a ab abc abcd abcde
| a|
| ab|
| abc|
|abcd|
|abcde|
С усечением:
$ printf '|%.4s|\n' a ab abc abcd abcde
|a|
|ab|
|abc|
|abcd|
|abcd|
$ printf '|%4.4s|\n' a ab abc abcd abcde
| a|
| ab|
| abc|
|abcd|
|abcd|
$ printf '|%-4.4s|\n' a ab abc abcd abcde
|a |
|ab |
|abc |
|abcd|
|abcd|
Другие утилиты для форматирования текста в столбцах включают POSIXexpand :
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(здесь расширение символа TAB ( \t) с помощью табуляции через каждые 30 столбцов)
Или BSDcolumn или POSIXpr :
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(здесь выводится по 2 столбцам шириной 36 столбцов (см. -wопцию изменения ширины страницы по умолчанию, равной 72)).
или BSDrs :
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(например column, не начнет выводить, пока не прочитает все входные данные).
Или GNUcolumns :
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zshтакже есть некоторые флаги расширения параметров для заполнения строк: ${(l:15:)hostname}для заполнения слева и ${(r:15:)hostname}для заполнения справа (с усечением). При развертывании подсказок (как в подсказках или в print -Pили как включено в раскрытиях параметров с %флагом) он также поддерживает %F{green}вывод цветов, поэтому вы можете сделать:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
Или:
print -rP "Network ${(r:15:)hostname}: $online"
Несмотря на то, что содержимое $hostnameзатем будет также подвергаться быстрому расширению, что могло бы стать уязвимостью внедрения команд, если содержимое $hostnameне было бы под вашим контролем (как в hostname='%<a[`reboot`]<')