Comment puis-je créer une barre de progression avec bash?
Voici mon 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
Je veux remplacer echo 'loading 50%'
par n'importe quoi pour créer une barre de progression.
command-line
bash
Black Hawk
la source
la source
eta
pourraient faire ce que vous voulez.Réponses:
whiptail
est préinstallé sur Ubuntu et de nombreuses autres distributions, et affichera des éléments de progression en plein écran (mais toujours basés sur les terminaux).dialog
est un surensemble dewhiptail
, donc cet exemple fonctionnera aussi bien avec les deux. Il fournit des éléments d'interface utilisateur plus avancés, il peut donc être utile si vous recherchez une interaction utilisateur telle que des sélecteurs de fichiers et des formulaires, mais il a l'inconvénient de ne pas être préinstallé sur de nombreux systèmes.Notez que la sortie du script est interprétée comme un pourcentage, vous devrez donc peut-être ajuster votre sortie en conséquence.
Whiptail et Dialog vous permettent également de modifier le texte au moment de l'exécution via une syntaxe plutôt cryptique:
pv
affiche la progression d'un fichier ou d'un flux en cours d'acheminement. Il ne peut cependant pas (facilement?) Être utilisé pour montrer la progression d'une opération personnalisée telle qu'une boucle. Il est spécialement conçu pour les flux.Quelques exemples concrets où cela
pv
est utile:Je ne connais aucune commande qui donne des barres de progression d'une ligne dans le style de
pv
ouwget
, mais il existe de nombreux scripts Bash / Perl / sed simples qui ajouteront cette fonctionnalité, comme d'autres l'ont partagé ici.la source
pv
vous pouvez soit lui faire rechercher la sortie de la boucle ou créer une fausse sortie, par exemple unecho
dans chaque itération, le diriger verspv
et lui donner le nombre d'itérations avec-s
. Si ce n'est pas souhaité, n'oubliez pas de rediriger la sortie standard de la boucle vers/dev/null
. Voici un exemple montrant cette approche .Vous pouvez utiliser
zenity
pour créer des fenêtres de dialogue GTK simples. L'une des options disponibles est une boîte de dialogue de barre de progression.Vous créez une telle fenêtre en utilisant
zenity --progress
. Pour le rendre utile, vous devez spécifier plus d'informations en ajoutant certaines des options ci-dessous (extrait deman zenity
):Il existe deux modes:
pulsation : la barre de progression clignote, elle indique simplement que quelque chose fonctionne, mais ne dit rien sur la progression. Pour ce faire, définissez l'
--pulsating
option.manuel : vous devez diriger le pourcentage de progression actuel vers l'
zenity
entrée standard de la commande pour mettre à jour la barre de progression.Un exemple pourrait ressembler à cela ci-dessous. Notez que les commandes précédentes sont regroupées dans un sous-shell afin que toute la sortie soit redirigée vers la
zenity
boîte de dialogue et pas seulement celle de la dernière commande:la source
[ ###########--------------] 52%
Ce code le fera et ne nécessite rien (autre que bash, bien sûr). Il imprime des
#
signes, comme vous l'avez demandé dans votre commentaire:Cependant, si vous avez beaucoup à vérifier, cela ne fera que remplir votre écran de
#
signes. Pour résoudre ce problème, essayez ce code:Remplacez le 5 de la première ligne (
lenProgressBar=5
) par la longueur souhaitée pour votre barre de progression. L'impression d'un#
panneau avec des barres de progression de longueur inférieure prendra plus de temps qu'avec des barres de longueur supérieure, mais ne laissez pas la longueur de la barre de progression dépasser la taille de votre écran; cela ne fonctionnera pas bien si vous le faites. (Il ne vous permettra pas d'utiliser une barre de progression supérieure au nombre d'éléments que vous vérifiez ou inférieure à 1)la source
tput cols
pour détecter la largeur de la fenêtre du terminal et mettre à l'échelle la barre de progression en conséquence.Voici une autre approche utilisant les codes d'échappement ansi:
la source