Controlled Countdown with Bash `for` Loop.

A simple Bash loop can turn a disruptive command into a controlled sequence. Using a for loop, you can implement a visible countdown that informs users and adds operational clarity before executing actions such as a system restart.

Controlled Countdown with Bash `for` Loop.
Photo by yannick Coffisee more @ Prints -/- yC -/- yc.wed

In system administration, seemingly simple commands can have significant operational impact when executed abruptly. Introducing basic control structures—such as Bash loops—helps make these operations more transparent, predictable, and user-aware. The following tutorial demonstrates how a simple for loop can transform a disruptive action into a controlled sequence, providing clear feedback to the user before execution.

COMMAND (Reusable Pattern)

$ for i in {5..1}; do echo "Action in $i..."; sleep 1; done && sudo <command>

Replace <command> with:

  • reboot
  • shutdown -h now
  • any other administrative command requiring controlled execution

This pattern introduces a short countdown before execution, giving users time to observe and react while ensuring the final command is run in a deliberate, controlled manner.

How It Works

  • for i in {5..1}
    Iterates in reverse (5 → 1), defining the countdown window
  • i is the loop variable
    It takes each value from the sequence {5..1}
  • echo "Action in $i..."
    Outputs a visible message at each step
  • sleep 1
    Introduces a 1-second delay between iterations (very important) without it, the loop still functions, but the output executes almost instantly, removing the intended pacing effect.
  • done marks the end of the loop block
    It tells Bash: “this is where the loop stops repeating”
  • && sudo <command>
    Executes the system action only if the loop completes successfully

Example Outputs

Reboot:

$ for i in {5..1}; do echo "Rebooting in $i..."; sleep 1; done && sudo reboot

Shutdown:

$ for i in {5..1}; do echo "Shutting in $i..."; sleep 1; done && sudo shutdown

Customization

  • Change duration
$ for i in {10..1}; do echo "Action in $i..."; sleep 1; done && sudo <command>
  • Faster countdown
$ for i in {5..1}; do echo "Action in $i..."; sleep 0.5; done && sudo <command>
  • Add system-wide warning
$ wall "⚠️ System action in progress..."
$ for i in {5..1}; do echo "Action in $i..."; sleep 1; done && sudo <command>

Notify users (TTY/SSH) on shared systems (use wall)

BONUS #1: Function Wrapper

A function wrapper is a way to package a set of shell commands into a reusable function. A function wrapper is simply a named block of commands that behaves like a custom command.

Instead of writing multiple lines every time, you define it once and reuse it:

system_action () {
  cmd=$1
  echo "⚠️ System action: $cmd"
  for i in {5..1}; do
    echo "Executing in $i..."
    sleep 1
  done
  sudo $cmd
}

Usage:

$ system_action reboot
$ system_action "shutdown -h now"
$ system_action <command>

How it works

1. Function definition

$ system_action () { ... }
  • system_action becomes a custom command
  • Everything inside { ... } is executed when the function is called

2. Input handling ($1)

$ cmd=$1
  • $1 = first argument passed to the function
  • Example:
$ system_action reboot

$1 = reboot


Where to add it

You have three (3) main options depending on how you want to use it:

Option 1: Temporary (current session only)
Paste directly in terminal.
Option 2: Permanent (recommended*)
Add it to your shell config.
Option 3: Script file (portable tool)
Make it executable sudo chmod +x system_action.sh

Add it to your shell config:

$ nano ~/.zshrc

Paste at the bottom.
Then reload:

$ source ~/.zshrc

In visudo (safer):

$ sudo visudo

Instead of disabling sudo authentication globally, define a restricted sudoers rule that allows only specific commands (e.g., reboot) to be executed with NOPASSWD. This limits passwordless privilege escalation to explicitly approved administrative actions, rather than removing authentication altogether.

your_username ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/shutdown

Replace your_username with your actual user.

Now this works without password, but everything else still requires a password → secure balance

Cancellation support

The script supports interruption via SIGINT (triggered by CTRL+C) during the countdown phase. When received, the process is immediately terminated, aborting the loop and preventing any subsequent execution of reboot, shutdown, or other privileged commands. This ensures no system action is triggered if the user cancels mid-sequence.

  • User can hit CTRL+C during countdown
  • Immediately aborts execution
  • No reboot/shutdown triggered

At its core, the for loop turns a single command into a controlled execution workflow. It’s a lightweight construct, but it introduces timing, visibility, and operational discipline—exactly what matters when handling critical system operations where precision and user awareness are non-negotiable.

For anything else… SNUBmonkey.com — stay tuned for more like this..

Keep Us Caffeinated  ⦿ ⦿
Icon Join our 33K+ readers Spotify Logo