printf e substituição com retorno de carro
Esse tipo de "mágica" pode ser feito via printf
e retorno de carro "\ r" para substituir a saída existente. No entanto, você terá que estar consciente para linhas consecutivas. Observe este exemplo:
#!/bin/bash
string="[ ] pinging google.com "
printf "%s" "$string"
if ping -c 4 -q google.com > /dev/null
then
printf "\r[OK"
printf "\n\n"
fi
Observe como temos a primeira sequência de caracteres "status", então usamos o retorno de carro para voltar ao início e sobrescrevemos os 3 primeiros caracteres com "[OK". As duas novas linhas a seguir são apenas exemplos do que você deseja fazer para mover o script e imprimir mais linhas. Quanto ao if command ; then . . . fi
, esta é uma estrutura simples que executa o corpo da instrução if condicionalmente, dependendo da saída command
.
A desvantagem dessa abordagem é que, se você não corresponder aos comprimentos de caractere do que está imprimindo, ela poderá ser exibida.
$ printf "Hello\rcat\n"
catlo
Aproximação ligeiramente melhor: limpar a linha com o código de escape
Podemos aproveitar código de escape ANSI para a linha de compensação (neste caso, em octal 3[2K
) para livrar-se do que já tínhamos na linha. Isso tem a vantagem de não se esgotar na questão do comprimento correspondente / não correspondente do que você imprime ao redefinir o cursor de volta ao início.
Veja um exemplo, com caracteres UTF-8 adicionados para verificação e marca cruzada
#!/bin/bash
string="[ ] pinging google.com "
printf "%s" "$string"
if ping -c 4 -q google.com > /dev/null
then
# clear previous line, add UTF checkmar to string
printf "\r%b" "3[2K"
string="[\U2713] pinging google.com "
else
# clear previous line, add UTF checkmar to string
printf "\r%b" "3[2K"
string="[\U274C] pinging google.com "
fi
printf "%b" "$string"