Como posso criar uma barra de progresso com o bash?
Este é o meu script:
#!/bin/bash
pass='number1 number12 number13 number14 number15 number16'
chk='number14'
for i in $pass ; do
if [ "$i" == "$chk" ]; then
echo ' Found ^_^'
else
echo 'loading 50%'
fi
done
Quero substituir echo 'loading 50%'
por qualquer coisa para criar uma barra de progresso.
command-line
bash
Falcão
fonte
fonte
eta
pode fazer o que quiser.Respostas:
whiptail
vem pré-instalado no Ubuntu e em muitas outras distribuições e mostra elementos de progresso em tela cheia (mas ainda com base em terminal).dialog
é um superconjunto dewhiptail
, portanto, este exemplo funcionará igualmente bem com ambos. Ele fornece elementos de interface do usuário mais avançados, por isso pode ser útil se você estiver procurando por interação do usuário, como selecionadores de arquivos e formulários, mas tem a desvantagem de não vir pré-instalado em muitos sistemas.Observe que a saída do script é interpretada como uma porcentagem; portanto, você pode precisar ajustar sua saída de acordo.
Whiptail e Dialog também permitem modificar o texto em tempo de execução por meio de uma sintaxe bastante enigmática:
pv
mostra o progresso de um arquivo ou fluxo sendo canalizado por ele. No entanto, não pode ser (facilmente?) Usado para mostrar o progresso de uma operação personalizada, como um loop. Ele foi projetado especificamente para fluxos.Alguns exemplos do mundo real são
pv
úteis:Não conheço nenhum comando que ofereça barras de progresso de uma linha no estilo de
pv
ouwget
, mas existem muitos scripts Bash / Perl / sed simples que adicionarão essa funcionalidade, como outros compartilhados aqui.fonte
pv
você pode fazer com que ele procure a saída do loop ou criar alguma saída falsa, por exemplo, umaecho
em cada iteração, canalize-apv
e faça a contagem da iteração-s
. Se não for desejado, lembre-se de redirecionar o stdout do loop para/dev/null
. Aqui está um exemplo mostrando essa abordagem .Você pode usar
zenity
para criar simples janelas de diálogo GTK. Uma das opções disponíveis é uma caixa de diálogo da barra de progresso.Você cria essa janela usando
zenity --progress
. Para torná-lo útil, você deve especificar mais informações adicionando algumas das opções abaixo (trecho deman zenity
):Existem dois modos:
pulsante : a barra de progresso está pulsando, apenas indica que algo está sendo executado, mas não diz nada sobre o progresso. Você faz isso definindo a
--pulsating
opçãomanual : você deve canalizar a porcentagem de progresso atual para a
zenity
entrada padrão do comando para atualizar a barra de progresso.Um exemplo para isso pode se parecer com o abaixo. Observe que os comandos anteriores são agrupados em um subshell para que toda a saída seja redirecionada para a
zenity
caixa de diálogo e não apenas para o último comando:fonte
[ ###########--------------] 52%
Esse código fará isso e não requer nada (exceto bash, é claro). Imprime
#
sinais, como você pediu no seu comentário:No entanto, se você tiver muito o que verificar, isso preencherá sua tela com
#
sinais. Para corrigir esse problema, tente este código:Altere o 5 na primeira linha (
lenProgressBar=5
) para o comprimento que você deseja que sua barra de progresso. Levará mais tempo para imprimir um#
sinal com barras de progresso de comprimento menor do que com barras de comprimento maior, mas não deixe que o comprimento da barra de progresso exceda o tamanho da tela; não vai funcionar bem se você fizer. (Não permitirá que você use uma barra de progresso maior que o número de itens que você está verificando ou menor que 1)fonte
tput cols
para detectar a largura da janela do terminal e dimensionar a barra de progresso de acordo.Aqui está outra abordagem usando códigos de escape ansi:
fonte