Differences between revisions 5 and 6
Revision 5 as of 2008-08-29 21:33:42
Size: 1449
Editor: cfajohnson
Comment:
Revision 6 as of 2008-11-22 14:08:52
Size: 1451
Editor: localhost
Comment: converted to 1.6 markup
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
[[Anchor(faq44)]] <<Anchor(faq44)>>
Line 19: Line 19:
 * An [:BashFAQ/005:array] named {{{files}}} is populated with all the files we want to process.  * An [[BashFAQ/005|array]] named {{{files}}} is populated with all the files we want to process.
Line 24: Line 24:
For more examples of using {{{dialog}}}, see [:BashFAQ/040:FAQ #40]. For more examples of using {{{dialog}}}, see [[BashFAQ/040|FAQ #40]].

How do I create a progress bar?

The easiest way is to use dialog --gauge. Here is an example, which relies heavily on BASH features:

   # Bash
   # Process all of the *.zip files in the current directory.
   files=(*.zip)
   dialog --gauge "Working..." 20 75 < <(
      n=${#files[*]}; i=0
      for f in "${files[@]}"; do
         # process "$f" in some way (for testing, "sleep 1")
         echo $((100*(++i)/n))
      done)

Here's an explanation of what it's doing:

  • An array named files is populated with all the files we want to process.

  • dialog is invoked, and its input is redirected from a ProcessSubstitution. (A pipe could also be used here; we'd simply have to reverse the dialog command and the loop.)

  • The processing loop iterates over the array.
  • Every time a file is processed, it increments a counter (i), and writes the percent complete to stdout.

For more examples of using dialog, see FAQ #40.

A progress bar can also be programmed without any external commands. This example assumes a terminal that uses standard ISO 6429 (a.k.a. ANSI or VT100) escape sequences:

files=(*)
width=$COLUMNS

n=${#files[*]}; i=0
for f in "${files[@]}"; do
  # process "$f" in some way (for testing, "sleep 1")
  printf "\e[40m\e[7m%$(($width*$i/$n))s\n\e[A" " "
  i=$(( $i + 1 ))
done
printf "\e[0m\n"

BashFAQ/044 (last edited 2017-11-13 22:19:11 by GreyCat)