Bash C Style For Loop Example and Syntax

How do I use the bash C style for loop under UNIX or Linux operating systems?

The bash C-style for loop share a common heritage with the C programming language. It is characterized by a three-parameter loop control expression; consisting of an initializer (EXP1), a loop-test or condition (EXP2), and a counting expression (EXP3). The syntax is as follows:


for (( EXP1; EXP2; EXP3 ))

Bash C-Style Example

# Display message 5 times
for ((i = 0 ; i < 5 ; i++)); do
  echo "Welcome $i times."

Sample outputs:

Welcome 0 times.
Welcome 1 times.
Welcome 2 times.
Welcome 3 times.
Welcome 4 times.

Read An Array Using C Style For Loop

Bash provides one-dimensional array variables. An array is created automatically using the following compound assignments syntax:

array=( item1 item2 item3 ... itemN)

You can read an array using for loop as follows:

# define an array called fruits
fruits=("Apple" "Mango" "Pineapple" "Banana" "Orange" "Papaya" "Watermelon")
len=${#fruits[*]}         # get total elements in an array
# print it
for (( i=0; i<${len}; i++ ));
	echo "${fruits[$i]}"

Here is another practical example that generates lighttpd web server configuration file to log real IP address of the visitors:

_frontend_proxy_lan_ips=("" "" "" "" "")
at=${#_frontend_proxy_lan_ips[*]}         # get total elements in an array
echo '### Log real client ips on all backends ###' >"$t"
echo 'server.modules += ( "mod_extforward" )'   >>"$t"
echo 'extforward.headers = ("X-Forwarded-For")' >>"$t"
echo 'extforward.forwarder = (' >>"$t"
# For loop 
for (( i=0; i<${at}; i++ ));
	[ $i -lt $(( $at - 1 )) ] && s="," || s=""      # remove , for last item in an array
        echo "      \"${_frontend_proxy_lan_ips[$i]}\" => \"trust\"${s} " >>"$t"
echo ')' >>"$t"
# Copy it
cp -f "$t" /etc/lighttpd/
# remove temp file
[ -f "$t" ] && rm -f "$t"

Sample outputs (sample config file generated by above script):

### Log real client ips on all backends ###
server.modules += ( "mod_extforward" )
extforward.headers = ("X-Forwarded-For")
extforward.forwarder = (
      "" => "trust", 
      "" => "trust", 
      "" => "trust", 
      "" => "trust", 
      "" => "trust" 
🐧 Get the latest tutorials on SysAdmin, Linux/Unix, Open Source/DevOps topics:
CategoryList of Unix and Linux commands
File Managementcat
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network Utilitiesdig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNCentOS 8 Debian 10 Firewall Ubuntu 20.04

2 comments… add one
  • kmkkmk Jun 10, 2011 @ 15:26


    I have just stumbled upon this site and like it a lot. Yet when reading Bash I was immediately thinking about Zsh and that I should have switched from to Zsh rather earlier than later. I would hardly put any effort in Bash and spent the time on Zsh instead.

    Keep up the good work.

  • Jotne Oct 10, 2012 @ 5:54

    More simple example of array

    GNU nano 2.2.6 File: a Modified

    fruits=("Apple" "Mango" "Pineapple" "Banana" "Orange" "Papaya" "Watermelon")
    for I in ${fruits[*]}; do
            echo $I

Leave a Reply

Your email address will not be published.

Use HTML <pre>...</pre>, <code>...</code> and <kbd>...</kbd> for code samples.