Используйте 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`]<'
)