Służy printf
do 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"
%-15s
jest specyfikacją formatu że klocki struny ze spacjami po prawej stronie tak jak długość (w liczbie znaków w zsh
i fish
i 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 -w
opcja 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 column
nie 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
zsh
ma 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 -P
lub 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ść $hostname
tego również podlegałaby szybkiemu rozszerzeniu, co stanowiłoby podatność na wstrzykiwanie poleceń, gdyby treść $hostname
nie była pod twoją kontrolą (jak w hostname='%<a[`reboot`]<'
)