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`]<'
)
column
(um comando BSD, também portado para Linux e encontrado por padrão em algumas distribuições, não deve ser confundido com o GNUcolumns
) precisará ler toda a entrada antes que possa começar a produzir algo, pois precisa calcular a largura das colunas com base em no mais largo.Atualize seu script para inserir um número definido para
\t
(tabs) onde você deseja tabular para uma coluna.A saída de algo semelhante ao seguinte forneceria o alinhamento necessário:
fonte
printf 'Network %s\t: Online\n' 8.8.8.8 192.168.122.123
não se alinha adequadamente. Você pode contornar isso usandoexpand
para expandir as guias com uma parada de guia diferente, como mostrado na minha resposta.Para exibir ainda melhor que o @Roman
Em seguida, adicione
\t
cada linha para dividi-la em coluna.fonte