Utilisez printf
pour formater la sortie (c'est aussi plus portable queecho
). Je voudrais également stocker la valeur réelle des séquences d'échappement de couleur au lieu de les stocker sous une forme qui nécessite une expansion par 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
est une spécification de format qui remplit les chaînes avec des espaces à droite afin que la longueur (en nombre de caractères dans zsh
et fish
et octets dans la plupart des autres shells / printf ) soit d'au moins 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|
Avec troncature:
$ 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|
Les autres utilitaires pour formater le texte dans les colonnes incluent POSIXexpand
:
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(en développant ici le caractère TAB ( \t
) avec des tabulations toutes les 30 colonnes)
Ou BSDcolumn
ou POSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(ici, sortie sur 2 colonnes de 36 colonnes de large (voir l' -w
option pour changer la largeur de page par défaut de 72)).
ou BSDrs
:
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(comme column
ne commencera pas la sortie tant qu'il n'aura pas lu toutes les entrées).
Ou GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
a également quelques drapeaux d'extension de paramètre pour le remplissage de chaîne: ${(l:15:)hostname}
pour le remplissage de gauche et ${(r:15:)hostname}
pour le remplissage de droite (avec troncature). Dans l'expansion des invites (comme dans les invites ou dans print -P
ou comme activé dans les extensions de paramètres avec l' %
indicateur), il prend également en charge %F{green}
la sortie couleur, vous pouvez donc faire:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
Ou:
print -rP "Network ${(r:15:)hostname}: $online"
Bien que le contenu de $hostname
soit alors soumis à une expansion rapide, ce qui constituerait une vulnérabilité d'injection de commande si le contenu de $hostname
n'était pas sous votre contrôle (comme dans hostname='%<a[`reboot`]<'
)