Utilizzare printf
per formattare l'output (è anche più portatile diecho
). Vorrei anche memorizzare il valore reale delle sequenze di escape colore invece di memorizzarle in una forma che richiede l'espansione 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
è una specifica di formato che riempie le stringhe di spazi a destra in modo che la lunghezza (in numero di caratteri in zsh
e fish
e byte nella maggior parte delle altre shell / printf ) sia almeno 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|
Con troncamento:
$ 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|
Altre utilità per formattare il testo in colonne includono POSIXexpand
:
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(qui espandendo il carattere TAB ( \t
) con tabulazioni ogni 30 colonne)
O BSDcolumn
o POSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(qui in uscita su 2 colonne larghe 36 colonne (vedere l' -w
opzione per modificare la larghezza della pagina dal valore predefinito di 72)).
o BSDrs
:
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(come column
non inizierà a produrre fino a quando non avrà letto tutto l'input).
O GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
ha anche alcuni flag di espansione dei parametri per il padding delle stringhe: ${(l:15:)hostname}
per il padding sinistro e ${(r:15:)hostname}
per il padding destro (con troncamento). Nell'espansione dei prompt (come nei prompt o in print -P
o come abilitato nelle espansioni dei parametri con il %
flag), supporta anche l' %F{green}
output a colori, quindi puoi fare:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
O:
print -rP "Network ${(r:15:)hostname}: $online"
Anche se il contenuto di $hostname
sarebbe quindi soggetto a una rapida espansione, che costituirebbe una vulnerabilità $hostname
all'inserimento di comandi se il contenuto di non fosse sotto il tuo controllo (come in hostname='%<a[`reboot`]<'
)