Використовуйте printf
для форматування виводу (він також більш портативний, ніжecho
). Я також зберігав би справжнє значення послідовностей відтінку кольорів замість того, щоб зберігати їх у формі, що вимагає розширення на 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`]<'
)