Verwenden Sie printfzum Format ausgegeben (es ist auch mehr tragbar alsecho ). Ich würde auch den tatsächlichen Wert der Farbfluchtsequenzen speichern, anstatt sie in einer Form zu speichern, die eine Erweiterung um erfordert 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"
%-15sist eine Formatspezifikation, die die Zeichenfolgen mit Leerzeichen auf der rechten Seite auffüllt, sodass die Länge (in Anzahl der Zeichen in zshund fishund Bytes in den meisten anderen Shells / printf ) mindestens 15 beträgt .
$ 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|
Mit Kürzung:
$ 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|
Andere Dienstprogramme zum Formatieren von Text in Spalten umfassen POSIXexpand :
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(hier das TAB-Zeichen ( \t) mit Tabulatoren alle 30 Spalten erweitern)
Oder BSDcolumn oder POSIXpr :
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(hier Ausgabe auf 2 Spalten mit einer -wBreite von 36 Spalten (siehe die Option zum Ändern der Seitenbreite von der Standardeinstellung 72)).
oder BSDrs :
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(Wie columnstartet die Ausgabe erst, wenn alle Eingaben gelesen wurden).
Oder GNUcolumns :
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zshAußerdem gibt es einige Parametererweiterungsflags für das Auffüllen von Zeichenfolgen: ${(l:15:)hostname}für das Auffüllen von links und ${(r:15:)hostname}für das Auffüllen von rechts (mit Kürzung). Bei der sofortigen Erweiterung (wie in Eingabeaufforderungen oder in print -Poder wie in Parametererweiterungen mit dem %Flag aktiviert ) wird auch die %F{green}Farbausgabe unterstützt , sodass Sie Folgendes tun können:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
Oder:
print -rP "Network ${(r:15:)hostname}: $online"
Der Inhalt von $hostnameunterliegt dann jedoch ebenfalls einer sofortigen Erweiterung, die eine Sicherheitsanfälligkeit in Bezug auf Befehlsinjektion darstellt, wenn der Inhalt von $hostnamenicht unter Ihrer Kontrolle steht (wie in hostname='%<a[`reboot`]<').