Loop command. The for loop executes a sequence of commands for each member in a list of items.

      for name [in words ...]; do commands; done

For each element in words, name is set to that element, and the commands are executed.
If `in words' is not present, the for command executes the commands once for each positional parameter that is set, as if `in "$@"' had been specified

      for (( expr1 ; expr2 ; expr3 )) ; do commands ; done

Equivalent to:

     (( EXP1 ))
     while (( EXP2 )); do
      (( EXP3 ))

EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is omitted, it behaves as if it evaluates to 1.


The words can be a simple list of strings file1.txt file2.txt file3.txt or Apple Sony "Hewlett Packard"

Alternatively, create the words by iterating over the output of another command - so to print the numbers from 1 to 10 with backticks:

for i in `seq 1 10` 
echo "$i"

or with Brace Expansion.

for i in {1..10} 
echo "$i"

or as a one liner:
for i in {1..10}; do echo $i; done

When a wildcard is introduced, then words will match against filenames, * will match every file in the directory.

for thisfile in *; do
   echo "found $thisfile"

The second form of the for command is evaluated thus:

First, the arithmetic expression expr1 is evaluated according to shell arithmetic expression rules.
The arithmetic expression expr2 is then evaluated repeatedly until it evaluates to zero.

Each time expr2 evaluates to a non-zero value, commands are executed and the arithmetic expression expr3 is evaluated.
If any expression is omitted, it behaves as if it evaluates to 1.

Return Status

The Return Status of for will be the exit status of the last command that executes, (if there are multiple expressions then the last command in list .)
If there are no items in the expansion of words, no commands are executed, and the return status is zero.

The return status is false if any of the expressions is invalid.

Positional Parameters

These are assigned from the shell's arguments when the shell is invoked, they can be reassigned using the set builtin command.
Positional parameter N can be referenced as ${N}, or as $N when N consists of a single digit. $1, $2 etc.

This is a BASH shell builtin, to display your local syntax from the bash prompt type: help for


Loop through a list of items:

#! /bin/bash
# List of manufacturers
for co in Apple Sony "Hewlett Packard" Nokia
echo "Manufacturer is:" $co

The above can also be written as a single line:
for co in Apple Sony "Hewlett Packard" Nokia; do echo "Manufacturer is:" $co; done

Loop through all the files in a 'lodef' folder, for each one, copy an identically named file from the 'hidef' folder into the 'matching' folder:

for filename in $(ls lodef/); do cp hidef/$filename matching/$filename; done;

Loop through a folder of .jpg files and rename (mv) all the filenames, replacing all spaces with underscores '_':

# First set the Field Separator to a Newline only

for f in *.jpg
do mv "$f" "${f// /_}"
# Restore the original field separator

Convert a folder filled with .jpgs to .pngs using sips:

$ for fi in *.jpg; do sips -s format png $fi --out $fi.png; done

Rename a set of image files from IMG_0001.PNG, IMG_0002.PNG... to ScreenShot01.png, ScreenShot01.png...

for name in IMG*PNG
  # Work out the new name
  newname="$(echo $name | sed "s/IMG_00/ScreenShot/;s/PNG/png/")"

  # Move/rename the files
  echo "renaming $name as $newname"
  mv $name $newname

Print the months of the year with zeropadding:

for month in 2020-0{1..9} 2020-{10..12} 2021-0{1..9}; do echo $month;done;

"In expanding the field of knowledge, we but increase the horizon of ignorance" ~ Henry Miller

Related macOS commands

break - Exit from a loop.
while - Execute commands.
continue - Resume the next iteration of a while or foreach loop.
until - Execute commands (until error).

Copyright © 1999-2024
Some rights reserved