Display runnning countdown in a bash script?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Display runnning countdown in a bash script?
# 1  
Old 01-29-2009
Display runnning countdown in a bash script?

I am looking for a way to display on a single line, a running countdown for a given amount of time in a terminal using a bash script.

I am looking for this to use as part of a larger bash script that captures Video. The script sets up a bunch of parameters for DVgrab, and one of the parameters set is the tape length. I would like to use this $tape_length as the input for a running countdown so that at any time during capture I can see how much longer the capture will run for.

On a side note, in my script $tape_length is entered in the form hh:mm:ss

I feel like this should be easy, but despite some extensive searching I can't find any leads or even scripts to steal and modify! Any help is much appreciated, I'm very new to bash scripting...
# 2  
Old 01-30-2009
This uses a few tricks to do what you want:
  • The printf command does NOT append a linefeed automatically unless you tell it to.
  • Setting IFS to something else lets the shell split things apart into arrays on whatever delimiter you want, in this case , :.
  • The date command can be used to produce time in seconds.
  • Carriage returns return the cursor to the beginning of the line without moving to the next line.

Code:
function countdown
{
        local OLD_IFS="${IFS}"
        IFS=":"
        local ARR=( $1 )
        local SECONDS=$((  (ARR[0] * 60 * 60) + (ARR[1] * 60) + ARR[2]  ))
        local START=$(date +%s)
        local END=$((START + SECONDS))
        local CUR=$START

        while [[ $CUR -lt $END ]]
        do
                CUR=$(date +%s)
                LEFT=$((END-CUR))

                printf "\r%02d:%02d:%02d" \
                        $((LEFT/3600)) $(( (LEFT/60)%60)) $((LEFT%60))

                sleep 1
        done
        IFS="${OLD_IFS}"
        echo "        "
}

countdown "00:07:55"

# 3  
Old 01-30-2009
Thanks!

That is exactly what I needed Thanks! At first it was counting down and then starting the capture, but I just added an "&" and she works great!

Timer

(Just wanted to include this for search purposes...)
# 4  
Old 03-30-2009
Quote:
Originally Posted by Corona688
This uses a few tricks to do what you want:
Great little script, Corona688, just what I needed! Smilie

Here's a little variant I wrote that allows you to prefix the countdown timer with a custom message:

Code:
countdown "00:07:55" Time left before entering the matrix

... which produces something like:

Code:
Time left before entering the Matrix > 00:00:08

Here's my patch:

Code:
pvdb@localhost ~ $ diff original prefix 
5c5,7
<         local ARR=( $1 )
---
>         local ARR=( $1 ) ; shift
>         IFS="${OLD_IFS}"
>         local PREFIX="$*" ; [ -n "${PREFIX}" ] && PREFIX="${PREFIX} > "
16c18
<                 printf "\r%02d:%02d:%02d" \
---
>                 printf "\r${PREFIX}%02d:%02d:%02d" \
21d22
<         IFS="${OLD_IFS}"
pvdb@localhost ~ $ _

# 5  
Old 03-30-2009
Great idea, thanks for the patch! But since your copy/paste of it wasn't identical down to the last bit of whitespace and newline(possible disagreement on spaces per tab, etc) I'm having trouble applying it... diff -U is generally preferred these days as it gives more complete information on what's being replaced where, but a full code-listing really can't be that much larger.

But I think I see a potential problem in your use of printf: if your PREFIX variable includes control sequences like %d it will cause printf to do strange things since it will insert parameters from the commandline. Try inserting %s instead of PREFIX, and making "${PREFIX}" the first argument printf is given. This will guarantee the string is printed as 100% literals.
# 6  
Old 03-30-2009
Quote:
Originally Posted by Corona688
Code:
countdown "00:07:55"


That will fail for 00:08:09.

Here is my version, which will work in any POSIX shell:

Code:
countdown()
(
  IFS=:
  set -- $*
  secs=$(( ${1#0} * 3600 + ${2#0} * 60 + ${3#0} ))
  while [ $secs -gt 0 ]
  do
    sleep 1 &
    printf "\r%02d:%02d:%02d" $((secs/3600)) $(( (secs/60)%60)) $((secs%60))
    secs=$(( $secs - 1 ))
    wait
  done
  echo
)

# 7  
Old 04-02-2009
Hi cfajohnson,

Thanks for your version of the script... very enlightening!

Quick question: instead of doing a "raw" sleep...

Code:
sleep 1

your version does this instead...

Code:
    sleep 1 &
    ...
    wait

I'm assuming doing it does way minimizes the "skew" on the actual time spent in the function, ie. every cycle is as close to 1 second as possible, as opposed to 1 second + however long it takes to do all the work.

Is that correct, or is there another benefit in doing it this way?

Regards,

PVDB
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Perl script countdown

In the below bash when the perl is it possible to hide the commands from running on screen and display a process countdown? For example, on the cygwin screen now the user sees each process in the command running as running protocol refGene, running protocol popfreq_all, etc... Could a... (0 Replies)
Discussion started by: cmccabe
0 Replies

2. Shell Programming and Scripting

Bash script to display result in table

My script gives the following result. Is it possible to display the same in table format ? 1. rex_best Latest feeds are not avaialable. The last feed was generated on 2012-05-17 File Name = ekb_best_20120517_010949_665.tar.gz The Number of entry elements = 4209539 2. rex_genre Latest... (2 Replies)
Discussion started by: kishorekumar87
2 Replies

3. Shell Programming and Scripting

Bash - countdown timer

Hello, I have another problem with my script - I would like to have a countdown timer visible on the screen, and at the same time, I want te be able to do something else. And when the time runs out, I need to know about that inside the script somehow and do some action. I guess that would require 2... (3 Replies)
Discussion started by: xqwzts
3 Replies

4. Shell Programming and Scripting

How to refresh a graphical display through bash script

Hi folks , I need to display a message graphically using a messagebox or textbox through bash script. However the message should be keep changing every 4 secs . I input the message from a file and use "gxmessage" to display it . gxmessage -nofocus -center -title "Welcome screen" -geometry... (3 Replies)
Discussion started by: ddspark
3 Replies

5. Shell Programming and Scripting

Anyone know of any FUN countdown script

Hi all, Does anyone know of any FUN countdown script that I can use for my script? At the moment, am just using sleep 10 or more and then print stuff into the screen to allow more time for the user to decide whether they want to continue running the script or abort? Just thought of wanting... (3 Replies)
Discussion started by: newbie_01
3 Replies

6. Shell Programming and Scripting

bash script to display tail

Hi everyone, I'm trying to write a script to format a file using unix2dos. I want to output all but the first 14 lines in a file. Then I want to pipe this to unix2dos to convert the output to a file that's easily readable on windows. Here's what I have: export Lines=`wc -l < $1` export... (11 Replies)
Discussion started by: LuminalZero
11 Replies

7. Shell Programming and Scripting

Stop! (the countdown!) :-) shell script help

Hi guys, I've found two nifty little scripts on these forums one which detects if the F5 key has been pressed: #/bin/sh _key() { local kp ESC=$'\e' _KEY= read -d '' -sn1 _KEY case $_KEY in "$ESC") while read -d '' -sn1 -t1 kp do _KEY=$_KEY$kp ... (0 Replies)
Discussion started by: rich@ardz
0 Replies

8. Shell Programming and Scripting

runnning a shell script in multiple folders

Hey everyone, I'm fairly new to both unix and shell scripts. Right now I have a script that I can run in one folder (if a certain text file is there, do one thing, if it's not, do something else). I want to modify this to run in multiple directories. My setup is: a company directory, and within it... (2 Replies)
Discussion started by: melearlin
2 Replies

9. Shell Programming and Scripting

Bash Script to display directories in Path?

Hello there, As a newbie: The directories in PATH can be hard to distinguish when printed out as one line with colon .Please, can i have a sample script to display them,one to a line. Thank you. (1 Reply)
Discussion started by: debut
1 Replies

10. UNIX for Dummies Questions & Answers

shell script - loop to countdown

I am taking a class in UNIX and have written a script that needs to countdown from a number that is read in from the keyboard to zero. If no number is given the start of the countdown should default to 10. I can't get this to do the default #! /bin/sh echo Enter a number here to countdown... (2 Replies)
Discussion started by: froggwife
2 Replies
Login or Register to Ask a Question