Bird
Raised Fist0
Bash Scriptingscripting~10 mins

Progress indicators in Bash Scripting - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Progress indicators
Start Task
↓
Initialize Progress
↓
Loop: Update Progress
↓
Display Progress Bar
↓
Check Completion
v +----> Back to Loop↓
End Task
↩v +----> Back to Loop
The script starts a task, initializes progress, then loops updating and displaying the progress bar until the task completes.
Execution Sample
Bash Scripting
total=10
for i in $(seq 1 $total); do
  sleep 0.2
  percent=$((i * 100 / total))
  echo -ne "Progress: $percent%\r"
done
echo
This script shows a simple progress percentage updating in place as a loop runs.
Execution Table
IterationipercentActionOutput
1110Calculate percent and displayProgress: 10%
2220Calculate percent and displayProgress: 20%
3330Calculate percent and displayProgress: 30%
4440Calculate percent and displayProgress: 40%
5550Calculate percent and displayProgress: 50%
6660Calculate percent and displayProgress: 60%
7770Calculate percent and displayProgress: 70%
8880Calculate percent and displayProgress: 80%
9990Calculate percent and displayProgress: 90%
1010100Calculate percent and displayProgress: 100%
Exit--Loop ends after i=10Progress complete
💡 i reaches 10, loop ends, progress reaches 100%
Variable Tracker
VariableStartAfter 1After 2After 3After 4After 5After 6After 7After 8After 9After 10Final
i-1234567891010
percent-102030405060708090100100
Key Moments - 3 Insights
Why does the progress percentage overwrite the previous output instead of printing new lines?
Because the script uses 'echo -ne' with '\r' (carriage return) to return the cursor to the line start, so the new progress overwrites the old one (see execution_table rows 1-10).
What happens if the sleep command is removed?
The progress updates too fast to see, making the progress bar appear instantly complete (refer to execution_table timing implied by 'sleep 0.2').
Why is there an extra 'echo' after the loop?
To move the cursor to the next line after the progress finishes, so the prompt or next output doesn't overwrite the progress line (after exit row in execution_table).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of 'percent' at iteration 5?
A40
B60
C50
D30
💡 Hint
Check the 'percent' column in the execution_table row for iteration 5.
At which iteration does the loop end according to the execution table?
A10
B9
C11
D5
💡 Hint
Look for the 'Exit' row and the last iteration number in the execution_table.
If the total variable was changed to 20, how would the 'percent' value at iteration 10 change?
A20
B50
C100
D10
💡 Hint
Percent is calculated as (i * 100 / total), so at i=10 and total=20, percent = 50.
Concept Snapshot
Progress indicators in bash:
- Use a loop to track progress steps
- Calculate percent: (current_step * 100 / total_steps)
- Use 'echo -ne' with '\r' to overwrite line
- Add 'sleep' to slow updates for visibility
- End with 'echo' to move cursor down
Full Transcript
This visual execution shows how a bash script can display a progress indicator by looping from 1 to total steps. Each iteration calculates the percent complete and prints it on the same line using carriage return '\r'. The sleep command slows the loop so the progress is visible. The loop ends when the counter reaches the total, and a final echo moves the cursor to the next line. Variables 'i' and 'percent' update each iteration, showing progress from 10% to 100%. This method helps users see task progress in the terminal without cluttering output.

Practice

(1/5)
1. What is the main purpose of using a progress indicator in a bash script?
easy
A. To print all output to a file instead of the screen
B. To speed up the execution of the script
C. To stop the script if an error occurs
D. To show the user that a long-running task is still working

Solution

  1. Step 1: Understand what progress indicators do

    Progress indicators provide visual feedback during long tasks to reassure users the script is running.
  2. Step 2: Identify the correct purpose

    Among the options, only showing the user the task is still working matches the purpose of progress indicators.
  3. Final Answer:

    To show the user that a long-running task is still working -> Option D
  4. Quick Check:

    Progress indicator purpose = show task progress [OK]
Hint: Progress indicators show task status, not speed or errors [OK]
Common Mistakes:
  • Thinking progress indicators speed up scripts
  • Confusing progress indicators with error handling
  • Assuming progress indicators redirect output
2. Which of the following bash code snippets correctly updates the same line to show a spinner?
easy
A. echo -ne "|\r"; sleep 1; echo -ne "/\r"
B. echo "|"; sleep 1; echo "/"
C. echo -n "|"; sleep 1; echo -n "/"
D. echo -e "|\n"; sleep 1; echo -e "/\n"

Solution

  1. Step 1: Understand how to update the same line in bash

    Using echo -ne with \r returns the cursor to the start of the line to overwrite it.
  2. Step 2: Check each option for correct usage

    echo -ne "|\r"; sleep 1; echo -ne "/\r" uses echo -ne "|\r" and echo -ne "/\r", which updates the same line. Others print new lines or lack -e or -n.
  3. Final Answer:

    echo -ne "|\r"; sleep 1; echo -ne "/\r" -> Option A
  4. Quick Check:

    Use echo -ne with \r to update line [OK]
Hint: Use echo -ne and \r to overwrite the same line [OK]
Common Mistakes:
  • Using echo without -n or -e flags
  • Using \n instead of \r to update line
  • Printing spinner on new lines instead of same line
3. What will be the output of this bash snippet?
for i in {1..3}; do
  echo -ne "Processing $i...\r"
  sleep 1
done
echo "Done!"
medium
A. Processing 1... Processing 2... Processing 3... Done!
B. Processing 3... Done!
C. Processing 1...Processing 2...Processing 3...Done!
D. Done! Processing 3...

Solution

  1. Step 1: Understand echo -ne with \r inside the loop

    Each loop iteration prints 'Processing i...' and returns cursor to line start, overwriting previous output.
  2. Step 2: Determine final visible output after loop

    Only the last 'Processing 3...' remains visible, then 'Done!' prints on a new line.
  3. Final Answer:

    Processing 3... Done! -> Option B
  4. Quick Check:

    \r overwrites line, last iteration visible [OK]
Hint: Remember \r returns cursor, overwriting previous line [OK]
Common Mistakes:
  • Thinking all lines print separately
  • Confusing \r with \n
  • Ignoring that echo -ne prevents newline
4. Identify the error in this bash spinner script snippet:
spinner="|/-\\"
while true; do
  for i in $(seq 0 3); do
    echo -ne "${spinner:$i:1}\r"
    sleep 0.2
done
done
medium
A. The script will cause an infinite loop without exit
B. The for loop uses incorrect sequence range
C. The spinner string is missing characters
D. The substring syntax ${spinner:$i:1} is invalid in bash

Solution

  1. Step 1: Analyze the loop structure

    The outer while true loop runs forever without any exit condition.
  2. Step 2: Check for exit or break statements

    No break or exit is present, so the spinner runs infinitely, which may be unintended.
  3. Final Answer:

    The script will cause an infinite loop without exit -> Option A
  4. Quick Check:

    while true without break causes infinite loop [OK]
Hint: Check loops for exit conditions to avoid infinite loops [OK]
Common Mistakes:
  • Assuming infinite loops are errors always
  • Confusing substring syntax with error
  • Ignoring that spinner string is correct
5. You want to create a progress bar in bash that fills from 0% to 100% in 10 steps, updating on the same line. Which approach correctly implements this?
hard
A. Use echo without -n or -e flags inside the loop to print progress
B. Print all '#' characters at once, then sleep 10 seconds
C. Use a loop from 1 to 10, print '#' repeated i times with echo -ne and \r, then sleep
D. Use multiple echo commands without \r to print progress on new lines

Solution

  1. Step 1: Understand progress bar update method

    To update on the same line, use echo -ne with \r to overwrite the line each iteration.
  2. Step 2: Implement loop with repeated '#' characters

    Loop from 1 to 10, print '#' repeated i times, then sleep to simulate progress.
  3. Final Answer:

    Use a loop from 1 to 10, print '#' repeated i times with echo -ne and \r, then sleep -> Option C
  4. Quick Check:

    Loop + echo -ne + \r = progress bar update [OK]
Hint: Use echo -ne with \r and repeated chars in loop [OK]
Common Mistakes:
  • Printing progress on new lines instead of same line
  • Not using echo -n or -e flags
  • Printing all progress at once without updates
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard