Use printf
para formatar a saída (também é mais portátil queecho
). Também armazenaria o valor real das seqüências de escape de cores em vez de armazená-las de uma forma que exija expansão por 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
é uma especificação de formato que as almofadas das cordas com espaços sobre a direita de modo como o comprimento (em número de caracteres em zsh
e fish
e bytes de mais outros escudos / printf ) para ser, pelo 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|
Com truncamento:
$ 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|
Outros utilitários para formatar texto em colunas incluem POSIXexpand
:
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(aqui expandindo o caractere TAB ( \t
) com tab stops a cada 30 colunas)
Ou BSDcolumn
ou POSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(aqui exibindo 2 colunas de 36 colunas de largura (consulte a -w
opção para alterar a largura da página do padrão de 72)).
ou BSDrs
:
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(o tipo column
não começará a produzir até que tenha lido toda a entrada).
Ou GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
também possui alguns sinalizadores de expansão de parâmetro para preenchimento de cadeia de caracteres: ${(l:15:)hostname}
para preenchimento esquerdo e ${(r:15:)hostname}
para preenchimento direito (com truncamento). Na expansão rápida (como em prompts ou dentro print -P
ou conforme habilitado nas expansões de parâmetro com o %
sinalizador), ele também suporta %F{green}
a saída em cores, para que você possa:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
Ou:
print -rP "Network ${(r:15:)hostname}: $online"
Embora o conteúdo de $hostname
também esteja sujeito a expansão imediata, o que constituiria uma vulnerabilidade de injeção de comando se o conteúdo de $hostname
não estivesse sob seu controle (como em hostname='%<a[`reboot`]<'
)