Służy printfdo formatowania danych wyjściowych (jest również bardziej przenośny niżecho ). Chciałbym również przechowywać rzeczywistą wartość sekwencji zmiany koloru zamiast przechowywać je w formie, która wymaga rozszerzenia 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"
%-15sjest specyfikacją formatu że klocki struny ze spacjami po prawej stronie tak jak długość (w liczbie znaków w zshi fishi bajtów w większości innych skorup / printf ) musi wynosić co najmniej 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|
Z obcięciem:
$ 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|
Inne narzędzia do formatowania tekstu w kolumnach obejmują POSIXexpand :
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(tutaj rozwijanie znaku TAB ( \t) z tabulatorami co 30 kolumn)
Lub BSDcolumn lub POSIXpr :
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(tutaj wyjście na 2 36-kolumnowych kolumnach (patrz -wopcja zmiany szerokości strony z domyślnej 72)).
lub BSDrs :
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(jak columnnie zacznie wypisywać, dopóki nie przeczyta wszystkich danych wejściowych).
Lub GNUcolumns :
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zshma również kilka flag rozszerzania parametrów dla dopełniania łańcucha: ${(l:15:)hostname}do dopełniania po lewej i ${(r:15:)hostname}do dopełniania po prawej (z obcięciem). W szybkim rozszerzaniu (jak w monitach lub w print -Plub tak, jak jest to włączone w rozszerzeniach parametrów z %flagą), obsługuje on również %F{green}wyświetlanie kolorów, dzięki czemu możesz:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
Lub:
print -rP "Network ${(r:15:)hostname}: $online"
Chociaż treść $hostnametego również podlegałaby szybkiemu rozszerzeniu, co stanowiłoby podatność na wstrzykiwanie poleceń, gdyby treść $hostnamenie była pod twoją kontrolą (jak w hostname='%<a[`reboot`]<')