Úselo printf
para formatear la salida (también es más portátil queecho
). También almacenaría el valor real de las secuencias de escape de color en lugar de almacenarlas en una forma que requiera expansión 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
es una especificación de formato que rellena las cadenas con espacios a la derecha para que la longitud (en número de caracteres en zsh
y fish
y bytes en la mayoría de los demás shells / printf ) sea de al menos 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 truncamiento:
$ 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|
Otras utilidades para formatear texto en columnas incluyen POSIXexpand
:
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(aquí expandiendo el carácter TAB ( \t
) con tabulaciones cada 30 columnas)
O BSDcolumn
o POSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(aquí se imprime en 2 columnas de 36 columnas de ancho (vea la -w
opción para cambiar el ancho de página del valor predeterminado de 72)).
o BSDrs
:
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(como column
no comenzará a salir hasta que haya leído toda la entrada).
O GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
también tiene algunos indicadores de expansión de parámetros para el relleno de cadena: ${(l:15:)hostname}
para el relleno izquierdo y ${(r:15:)hostname}
para el relleno derecho (con truncamiento). En la expansión rápida (como en las solicitudes o en print -P
o como habilitado en las expansiones de parámetros con el %
indicador), también admite %F{green}
la salida de color, por lo que puede hacer:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
O:
print -rP "Network ${(r:15:)hostname}: $online"
Aunque el contenido de $hostname
entonces también estaría sujeto a una rápida expansión, lo que constituiría una vulnerabilidad de inyección de comando si el contenido de $hostname
no estuviera bajo su control (como en hostname='%<a[`reboot`]<'
)