Utilizzare printfper 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 zshe fishe 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' -wopzione 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 columnnon 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
zshha 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 -Po 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 $hostnamesarebbe quindi soggetto a una rapida espansione, che costituirebbe una vulnerabilità $hostnameall'inserimento di comandi se il contenuto di non fosse sotto il tuo controllo (come in hostname='%<a[`reboot`]<')