Para un temporizador bash, uso este código:
#!/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!"
Eso me da algo asi
One Moment please: 60 59 58 57 56 55 ...
¿Existe la posibilidad de reemplazar el último valor de segundo por el más reciente para que la salida no genere un gran rastro sino la cuenta regresiva de segundos como un tiempo real en una posición? (Espero que entiendas lo que quiero decir :))
watch
comando, aunque no estoy seguro de cómo hacerlo.Respuestas:
fuente
\r
. Mira mi respuesta.The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
. Utilice el POSIX$((expression))
o el((
comando en su lugar. Por ejemplo,sek=$(( sek - 1 ))
or(( sek = sek - 1 ))
o(( sek-- ))
.Básicamente es lo mismo que la respuesta de aneeshep, pero usa Return (
\r
) en lugar de Retroceso (\b
) porque no sabemos si la longitud siempre será la misma, por ejemplo, cuándo$sek < 10
.Además, el primero
echo
debe usar$sek
, no código duro60
.Finalmente, observe el espacio después de
...
.fuente
Con bash puedes usar la variable especial
SECONDS
.fuente
SECONDS
Esta variable se expande a la cantidad de segundos desde que se inició el shell. (así que probablemente no lo establecería en 0 ... soloAdemás de
\r
o se\b
acerca, es posible usar el\033[2K
carácter de control , que le dice al terminal que limpie toda la línea. La ventaja de esto en comparación con\b
es que no tiene que hacer coincidir el número\b
con la cantidad de caracteres que desea eliminar, y en comparación\r
no habrá caracteres sobresaliendo en la pantalla si la nueva línea es más corta que la anterior uno.A continuación se muestra el ejemplo de cómo se puede aplicar a esta pregunta, y aquí hay un ejemplo de la aplicación relacionada para crear resultados similares a los mensajes de arranque. En este ejemplo en particular, el temporizador desaparecerá una vez que se alcance el segundo segundo y la línea del temporizador se reemplazará con "¡Listo!" frase.
Otra alternativa sería emplear el
dialog
comando para crear cuadros de diálogo simples en la línea de comandos. El cuadro de diálogo permanecerá en la pantalla mientras dure el temporizador y se actualizará con el bucle, y para cuando termine, el temporizador se reemplazará con el mensaje "¡Listo! Presione para salir" de manera transparente:fuente
dialog
no existe en mac: /Esto es lo que se me ocurrió después de leer aquí y un poco más, el único revestimiento:
Más legible:
Donde SEC se puede establecer en cualquier número entero positivo y printf se encargará del relleno apropiado. Probado bajo Ubuntu y cygwin.
fuente
Puede lograrlo colocando el retorno de carro
\r
.En una sola línea de código, es posible con
echo -ne
o con
printf
fuente
Contador regresivo:
y el cronómetro 'normal' es:
control + c para detener
fuente