How To Find BASH Shell Array Length ( number of elements )

by Vivek Gite on March 27, 2008 · 13 comments

Q. How do I define array in a bash shell script? How do I find out bash array length (number of elements) while running a script using for shell loop?

A. Bash provides one-dimensional array variables. Any variable may be used as an array; the declare builtin will explicitly declare an array. There is no maximum limit on the size of an array, nor any requirement that members be indexed or assigned contiguously.

How do I define bash array?

Array can be defined using following syntax:
ArrayName=("element 1" "element 2" "element 3")
Define array called distro with 3 elements, enter:

distro=("redhat" "debian" "gentoo")

How do I reference any element in bash array?

Any element of an array may be referenced using following syntax:

${ArrayName[subscript]}

To print redhat i.e first element enter:

echo ${distro[0]}
echo ${distro[2]}  # will print gentoo

How do I find out bash shell array length?

You can easily find out bash shell array length using following syntax:

${#ArrayName[@]}

To print distro array length enter:

echo ${#distro[@]} 

Sample output:

3

If subscript is @ or *, the word expands to all members of name. By prefixing # to variable you will find length of an array (i.e number of elements).

Putting it all together

A sample shell script to print array called NAMESERVERS:

#!/bin/bash
# define array
# name server names FQDN
NAMESERVERS=("ns1.nixcraft.net." "ns2.nixcraft.net." "ns3.nixcraft.net.")
 
# get length of an array
tLen=${#NAMESERVERS[@]}
 
# use for loop read all nameservers
for (( i=0; i<${tLen}; i++ ));
do
  echo ${NAMESERVERS[$i]}
done

Sample output:

ns1.nixcraft.net.
ns2.nixcraft.net.
ns3.nixcraft.net.

Featured Articles:

Share this with other sys admins!
Facebook it - Tweet it - Print it -

{ 13 comments… read them below or add one }

1 S. Nilesh July 27, 2008

Nice one ;)

Reply

2 Diya July 28, 2008

Excellent info.

Reply

3 those August 5, 2008

how to clean the array? ;d

Reply

4 Dan June 16, 2010

Here’s a quick flush:
NUM=${#a[@]}; for ((i=0;i<${NUM};i++)); do a[${i}]=''; done

And a for a quick scan, you can do the following either before or after:
COUNT=0; while [ ${COUNT} -lt ${#a[@]} ]; do echo ${a[${COUNT}]}; COUNT=$((COUNT+1)); done

Reply

5 budacsik September 20, 2008

Hi!
I think that this example is bad.
I would do this without a block .

#!/bin/bash

NAMESERVERS=”ns1.nixcraft.net. ns2.nixcraft.net. ns3.nixcraft.net.”
for i in $NAMESERVERS; do
echo “$i”
done

Reply

6 Dan June 16, 2010

That only works if you have no spaces.

Reply

7 Ferk January 3, 2012

The way it’s done in the post only works when using bash. This is a more POSIX-compatible way of making it work. You can also change the element-separator character to something different than the space, using the variabe IFS.

Reply

8 Raymond February 7, 2009

Problems,

a[2]=222
echo ${#a[@]}
1

Thus this is the lenght of the array, not the index of the last element.

Try instead:
for i in “${a[@]}”; do echo $i; done

Some further ideas may be found at
http://tldp.org/LDP/abs/html/arrays.html
http://www.linuxjournal.com/content/bash-arrays

Best Regards,
Raymond

Reply

9 Dan June 16, 2010

Well yes, ${#a[@]} pretty much spits out the the number of elements in the array, like the document here said… notice that it’s plainly used as tlen which is the length of the array?

you could do it a million different ways…

NUM=${a[@]}
for ((i=0;i<${NUM};i++)); do echo ${a[${NUM}]}; done

or:

COUNT=0; while [ ${COUNT} -lt ${#a[@]} ]; do echo ${a[${COUNT}]}; COUNT=$((COUNT+1)); done

We could go on and on, since there's more than one way to skin a cat.

Reply

10 Stuart Holme October 27, 2010

Good points on handling a possibly sparse array, Raymond, but the example is pretty useful if you load the array yourself. Also note that you don’t need to use a variable to store the array length:

for (( i = 0 ; i < ${#my_array[@]} ; i++ )) do; echo "${my_array[i]}"; done

Note the implementations of BASH I am using don't require "$i" as the index of the array, they work fine with just "i". This only seems to work with single character length index variable names though, like "i", not with, for example, "index". YMMV.

Regards,
Stuart

Reply

11 Edward August 5, 2011

1.Write a Linux shell Script to count the Number of user accounts both normal and special or privileged user user accounts on the system.
2.Write an interactive Linux shell script to test whether a file is (a). Read Permission set. (b). Execution permission set (c). Is a non empty file (d). A regular file (e). Ia a directory.

Reply

12 Ryan October 3, 2011

lol @ all the bikeshedding syntax scholars here. Ok, your voice has been heard, move along idiots.

Reply

13 Dan January 3, 2012

It’s called sharing knowledge. If you don’t like it, move along.

Reply

Leave a Comment

You can use these HTML tags and attributes for your code and commands: <strong> <em> <ol> <li> <u> <ul> <blockquote> <pre> <a href="" title="">
What is 2 + 3 ?
Please leave these two fields as-is:
Solve the simple math so we know that you are a human and not a bot.




Previous post:

Next post: