KSH For Loop Array: Iterate Through Array Values

How do I use ksh for loop to iterate thought array values under a UNIX / Linux / BSD operating systems?

The ksh shell supports two types of arrays:
  1. Indexed array
  2. associative array
[donotprint]
Tutorial details
Difficulty level Easy
Root privileges No
Requirements Ksh
Est. reading time 5m
[/donotprint]An element of a ksh array variable is referenced by a subscript. The value of all non-negative subscripts must be in the range of 0 through 4,194,303.

Syntax

You can define array as follows either as an associative array or to be an indexed array.

Syntax for an indexed array

arrayName[0]=value1
arrayName[1]=value2
arrayName[3]=value3

OR use set command as follows:

set -A arrayName value1 value2 value3

Syntax for an associative array

typeset -A employees
employees[sirname]="value1"
employees[firstname]="value"

OR

set -A arrayName val1 val2 val3

Examples for ksh indexed array

For example, create an array called characters with three values as follows:

set -A characters Mugen Jin Fuu

To print first value, enter:

echo ${characters[0]}

To print 3rd and last value, enter:

echo ${characters[2]}

To print all values, enter:

echo ${characters[@]}

To count number of items in an array called characters, enter:

echo ${#characters[@]}

You can use for loop as follows to iterate through all values:

for i in ${characters[@]}; do echo "Samurai Champloo character - $i"; done

Sample outputs:

Samurai Champloo character - Mugen
Samurai Champloo character - Jin
Samurai Champloo character - Fuu

You can add two more items as follows to exiting array:

characters[3]="Sunflower-Samurai"
characters[4]="Detective-Manzo"

Sample Shell Script

#!/bin/ksh
# set array called nameservers
set -A nameservers 192.168.1.1 192.168.1.5 202.54.1.5
 
# print all name servers
for i in ${nameservers[@]}
do
	echo $i
done

Sample outputs:

Fig.01: Ksh for loop array ns demo

Ksh associative arrays examples

## set associative array ##
typeset -A ns 
 
## Add values ##
ns[home]="192.168.1.254" ## home dns server ip 
ns[isp]="123.1.2.254"    ## my isp dns server ip
ns[google]="8.8.8.8"     ## google public dns server ip
 
## Okay, display values #
print "${ns[home]}"
print "${ns[isp]}"
print "${ns[google]}"
 
## Count  number of items in an array #
print "${!ns[@]}"
 
## Use for loop to print all items in an array##
for i in "${!ns[@]}"
do
   echo "ns[$i] value is ${ns[$i]}"
done

Sample outputs:

ns[google] value is 8.8.8.8
ns[home] value is 192.168.1.254
ns[isp] value is 123.1.2.254

🐧 Get the latest tutorials on Linux, Open Source & DevOps via RSS feed or Weekly email newsletter.

🐧 7 comments so far... add one


CategoryList of Unix and Linux commands
Disk space analyzersdf duf ncdu pydf
File Managementcat cp mkdir tree
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Modern utilitiesbat exa
Network UtilitiesNetHogs dig 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 glances gtop jobs killall kill pidof pstree pwdx time vtop
Searchingag grep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04
7 comments… add one
  • Nisrine Aug 19, 2011 @ 7:05

    If i need to print the next value in the array if a certain condition is verified
    for example:
    for i in “${array[@]}”
    do
    if(….) then
    echo $(i+1)
    fi
    done

    $(i+1) is wrong what can i do?

    • Jason Oct 16, 2012 @ 12:26

      Hi Nisrine,

      I hope my necromancing is welcome here, in case your issue is still relevant.

      $(ì+1) should actually be $((i+1)), since double parentheses evaluate mathematical expressions.

      I hope this helps someone!

      Jason

      • Nisrine Oct 16, 2012 @ 14:14

        Thank you for ur reply! working!

        • rishab Jul 21, 2015 @ 12:31

          Wow she actually used your solution after 1 year :-P

  • Ken Jun 18, 2012 @ 21:21

    Excellent just what i needed for looping through an array

  • Dante Mar 1, 2016 @ 6:15

    Useful as f*ck!

  • skyhack Jun 15, 2016 @ 16:38

    If this were on StackExchange, +1000 for referencing Mugen, Jin, and Fuu.
    Very helpful!

Leave a Reply

Your email address will not be published.

Use HTML <pre>...</pre> for code samples. Still have questions? Post it on our forum