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`]<'
).