Verwenden Sie printf
zum 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"
%-15s
ist eine Formatspezifikation, die die Zeichenfolgen mit Leerzeichen auf der rechten Seite auffüllt, sodass die Länge (in Anzahl der Zeichen in zsh
und fish
und 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 -w
Breite 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 column
startet die Ausgabe erst, wenn alle Eingaben gelesen wurden).
Oder GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
Auß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 -P
oder 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 $hostname
unterliegt dann jedoch ebenfalls einer sofortigen Erweiterung, die eine Sicherheitsanfälligkeit in Bezug auf Befehlsinjektion darstellt, wenn der Inhalt von $hostname
nicht unter Ihrer Kontrolle steht (wie in hostname='%<a[`reboot`]<'
).
column
(ein BSD-Befehl, der ebenfalls auf Linux portiert ist und in einigen Distributionen standardmäßig vorkommt, nicht mit GNU zu verwechselncolumns
) die gesamte Eingabe gelesen werden muss, bevor mit der Ausgabe begonnen werden kann, da die Breite der Spalten berechnet werden muss auf der breitesten.Aktualisieren Sie Ihr Skript, um eine festgelegte Nummer in
\t
(Tabulatoren) einzufügen, in die Sie eine Spalte auslagern möchten.Wenn Sie etwas Ähnliches wie das Folgende ausgeben, erhalten Sie die erforderliche Ausrichtung:
quelle
printf 'Network %s\t: Online\n' 8.8.8.8 192.168.122.123
nicht richtig ausgerichtet wird. Sie könnenexpand
das umgehen , indem Sie die Registerkarten mit einem anderen Tabstopp erweitern, wie in meiner Antwort gezeigt.Um noch besser als @Roman anzuzeigen
Fügen Sie dann
\t
jede Zeile hinzu, um sie in Spalten aufzuteilen.quelle