Pour une minuterie bash, j'utilise ce code:
#!/bin/bash
sek=60
echo "60 Seconds Wait!"
echo -n "One Moment please "
while [ $sek -ge 1 ]
do
echo -n "$sek "
sleep 1
sek=$[$sek-1]
done
echo
echo "ready!"
Cela me donne quelque chose comme ça
One Moment please: 60 59 58 57 56 55 ...
Existe-t-il une possibilité de remplacer la dernière valeur de seconde par la plus récente afin que la sortie ne génère pas une grande traînée mais le compte à rebours des secondes comme un temps réel à une position? (J'espère que vous comprenez ce que je veux dire :))
watch
commande, même si je ne sais pas exactement comment le faire.Réponses:
la source
\r
. Voir ma réponse.The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
. Utilisez plutôt POSIX$((expression))
ou((
-command. Par exemplesek=$(( sek - 1 ))
ou(( sek = sek - 1 ))
ou(( sek-- ))
.Fondamentalement, la même chose que la réponse de aneeshep, mais utilise Return (
\r
) plutôt que Backspace (\b
) car nous ne savons pas si la longueur sera toujours la même, par exemple quand$sek < 10
.En outre, votre premier
echo
doit utiliser$sek
, pas du code dur60
.Enfin, notez l'espace après le
...
.la source
Avec bash, vous pouvez utiliser la variable spéciale
SECONDS
.la source
SECONDS
Cette variable se développe en nombre de secondes depuis le démarrage du shell. (donc je ne le mettrais probablement pas à 0 .. il suffit de le tester pendant 60 secondes de plus à partir du début du script) .. +1En plus des approches
\r
ou\b
, il est possible d'utiliser le\033[2K
caractère de contrôle , qui indique au terminal d'effacer toute la ligne. L'avantage de ceci par rapport au\b
fait que vous n'avez pas à faire correspondre le nombre de\b
avec le nombre de caractères que vous souhaitez supprimer, et par rapport à ce\r
qu'il n'y aura pas de caractères qui ressortent à l'écran si la nouvelle ligne est plus courte que l'ancienne une.Vous trouverez ci-dessous l'exemple de la façon dont il peut être appliqué à cette question, et voici un exemple de l'application associée pour créer une sortie similaire aux messages de démarrage. Dans cet exemple particulier, le minuteur disparaîtra une fois la 0e seconde atteinte et la ligne du minuteur sera remplacée par "Prêt!" phrase.
Une autre alternative serait d'employer la
dialog
commande pour créer des boîtes de dialogue simples en ligne de commande. La boîte de dialogue restera à l'écran pendant la durée du minuteur et se mettra à jour avec la boucle, et au moment où elle est terminée - le minuteur sera remplacé par le message "Prêt! Appuyez pour quitter" de manière transparente:la source
dialog
n'existe pas sur mac: /Voici ce que j'ai trouvé après avoir lu ici et un peu plus, la doublure:
Plus lisible:
Où SEC peut être réglé sur n'importe quel entier positif et le printf se chargera du remplissage approprié. Testé sous Ubuntu et cygwin.
la source
Peut y parvenir en plaçant le retour chariot
\r
.En une seule ligne de code, il est possible avec
echo -ne
ou avec
printf
la source
Compte à rebours:
et le chronomètre «normal» est:
contrôle + c pour arrêter
la source