Home / Knowledge Base / How to / Bash For Loop

Bash For Loop

Table of Contents

1. Introduction to Bash For Loops

When writing shell scripts in Bash (Bourne-Again Shell), one of the most essential constructs is the for loop. A for loop allows you to iterate through a sequence of items—such as files, numbers, or lines in a file—and perform operations on each item in turn. By automating repetitive tasks, for loops can save you time, reduce potential for error, and make your scripts more powerful.

Whether you’re a system administrator or a developer, understanding for loops is a fundamental step toward mastering shell scripting. In this article, we’ll explore the different ways to use for loops in Bash, complete with practical examples that you can adapt for your own workflows.

2. Basic Syntax of a Bash For Loop

The basic syntax of a for loop in Bash takes the following form:

for VARIABLE in LIST
do
    COMMANDS
done
  • VARIABLE: A placeholder that represents the current item in the list.
  • LIST: A collection of items (e.g., filenames, words, strings) to iterate through.
  • COMMANDS: One or more commands that execute on each iteration.

Key Points

  • The LIST can be hardcoded values, ranges generated by brace expansions, or output from another command.
  • It’s good practice to indent the commands inside the loop to improve readability.

3. Iterating Over a List of Values

One of the simplest ways to use a for loop is to explicitly define a list of values. This can be a set of strings, such as filenames, directory names, or arbitrary words.

#!/bin/bash

# Example: Iterating over a list of fruits
for fruit in apple banana cherry
do
    echo "Fruit: $fruit"
done

Explanation:

  • In this script, the variable fruit takes on the values apple, banana, and cherry sequentially.
  • For each value, the script prints the line Fruit: [value].

This approach is especially useful when you have a predefined set of items to process.

4. Iterating Over a Range of Numbers

Bash provides a convenient brace expansion feature that allows you to generate a range of numbers:

#!/bin/bash

# Example: Iterating from 1 to 5
for num in {1..5}
do
    echo "Number: $num"
done

Explanation:

  • {1..5} expands to 1 2 3 4 5.
  • The loop then runs for each number in this range, printing it out.

Using Step Values
You can also define a step value by using the following syntax: {START..END..STEP}.

#!/bin/bash

# Example: Iterating from 0 to 10, in steps of 2
for num in {0..10..2}
do
    echo "Even Number: $num"
done

{0..10..2} expands to 0 2 4 6 8 10, allowing you to process just the even numbers in that range.

5. C-Style For Loop in Bash

If you’re coming from a C/C++ background, you’ll find the C-style for loop in Bash familiar:

#!/bin/bash

# C-style for loop
for (( i=0; i<5; i++ ))
do
    echo "Iteration: $i"
done

Explanation:

  • (()) denotes an arithmetic context in Bash.
  • i=0 initializes the variable i to zero.
  • i<5 is the condition to keep the loop running.
  • i++ increments i by 1 after each iteration.

This style is often used when you need more complex arithmetic or conditions, making it a handy alternative to brace expansions and list-based loops.

6. Practical Examples

6.1 Looping Through Files in a Directory

A common use case is iterating through files in a directory. Let’s say you want to rename all .txt files to .bak:

#!/bin/bash

for file in /path/to/directory/*.txt
do
    if [ -f "$file" ]; then
        mv "$file" "${file%.txt}.bak"
        echo "Renamed $file to ${file%.txt}.bak"
    fi
done

Explanation:

  • *.txt grabs all .txt files in the specified directory.
  • [ -f "$file" ] checks if the file actually exists (avoiding errors if no .txt files are found).
  • mv renames each file, using parameter expansion to replace .txt with .bak.

6.2 Reading Lines from a File

If you want to process each line of a file—for example, a list of URLs—you can use a while loop combined with a redirect or a process substitution. However, you could still use a for loop if the contents don’t contain spaces:

#!/bin/bash

for line in $(cat urls.txt)
do
    echo "Pinging $line..."
    ping -c 1 "$line"
done

Note: If your file contains spaces or special characters, a while read loop is safer to avoid splitting lines incorrectly. But for a quick iteration, this method works.

6.3 Nested For Loops

For more complex tasks, you can embed one for loop inside another. This is especially helpful when dealing with multiple lists or multi-dimensional data:

#!/bin/bash

numbers="1 2 3"
letters="A B C"

for num in $numbers
do
    for letter in $letters
    do
        echo "Combination: $num$letter"
    done
done

Explanation:

  • For each number in 1 2 3, the inner loop runs through A B C.
  • Output includes Combination: 1A, 1B, 1C, then 2A, 2B, 2C, and so on.

7. Tips for Efficient Bash Scripting

  1. Use Descriptive Variable Names
    Choose variable names that make sense in the context of your loop (e.g., file, url, num) to increase readability.
  2. Quote Your Variables
    Always quote your variables like "$file" or "$line" to prevent word splitting when dealing with spaces or special characters.
  3. Check for Edge Cases
    • If you’re iterating over files, ensure the script behaves correctly when no files are found.
    • Make sure to handle invalid ranges or non-integer inputs.
  4. Use Comments
    Comment your code to clarify the purpose of each block—this is especially helpful when loops become more complex.
  5. Test and Debug
    Start with small test sets, print variable values at each iteration if needed, and verify output at every step.

A Bash for loop is a cornerstone in efficient shell scripting, enabling you to automate repetitive tasks and process multiple items quickly. From straightforward list-based loops and brace expansions to C-style iterations, Bash offers several ways to tailor loops to your workflow. By mastering these methods—along with best practices like quoting variables, testing edge cases, and writing clear code—you can significantly improve your productivity and script reliability.

Whether you’re automating system maintenance, processing data, or just looking to speed up everyday command-line tasks, a solid understanding of for loops is essential. Start incorporating the examples and tips above into your own scripts, and you’ll be well on your way to becoming a Bash scripting pro.

Additional Resources

By following these examples and best practices, you’ll be able to harness the power of Bash for loops to automate processes, streamline your workflow, and become a more efficient command-line user. Feel free to bookmark this guide and refer back as you continue to build your Bash scripting skills. Happy scripting!

G7 Acceleration Network

The G7 Acceleration Network boosts your website’s speed, security, and performance. With advanced full page caching, dynamic image optimization, and built-in PCI compliance, your site will load faster, handle more traffic, and stay secure. 

WordPress Hosting

Trusted by some of the worlds largest WooCommerce and WordPress sites, there’s a reason thousands of businesses are switching to G7