0% found this document useful (0 votes)
29 views

The Ultimate Bash Array Tutorial With 15 Examples

Uploaded by

bharathvenna
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
29 views

The Ultimate Bash Array Tutorial With 15 Examples

Uploaded by

bharathvenna
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 26

The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.

com/2010/06/bash-array-tutorial/

≡ Menu

Home
Free eBook
Start Here
Contact
About

The Ultimate Bash Array Tutorial with 15 Examples


by Sasikala on June 3, 2010
66 Like 110 Tweet

An array is a variable containing multiple values may be of same type or of different type. There is no maximum
limit to the size of an array, nor any requirement that member variables be indexed or assigned contiguously.
Array index starts with zero.

In this article, let us review 15 various array operations in bash.

This article is part of the on-going Bash Tutorial series. For those who are new to bash scripting, get a jump-start
from the Bash Scripting Introduction tutorial.

1. Declaring an Array and Assigning values

In bash, array is created automatically when a variable is used in the format like,
name[index]=value

name is any name for an array


index could be any number or expression that must evaluate to a number greater than or equal to zero.You
can declare an explicit array using declare -a arrayname.
$ cat arraymanip.sh
#! /bin/bash
Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${Unix[1]}

1 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

$./arraymanip.sh
Red hat

To access an element from an array use curly brackets like ${name[index]}.

2. Initializing an array during declaration


Instead of initializing an each element of an array separately, you can declare and initialize an array by
specifying the list of elements (separated by white space) with in a curly braces.
Syntax:
declare -a arrayname=(element1 element2 element3)

If the elements has the white space character, enclose it with in a quotes.
#! /bin/bash
$cat arraymanip.sh
declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora');

declare -a declares an array and all the elements in the parentheses are the elements of an array.

3. Print the Whole Bash Array

There are different ways to print the whole elements of the array. If the index number is @ or *, all members of
an array are referenced. You can traverse through the array elements and print it, using looping statements in
bash.
echo ${Unix[@]}

# Add the above echo statement into the arraymanip.sh


#./t.sh
Debian Red hat Ubuntu Suse

Referring to the content of a member variable of an array without providing an index number is the same as
referring to the content of the first element, the one referenced with index number zero.

4. Length of the Bash Array

We can get the length of an array using the special parameter called $#.

2 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

${#arrayname[@]} gives you the length of the array.


$ cat arraymanip.sh
declare -a Unix=('Debian' 'Red hat' 'Suse' 'Fedora');
echo ${#Unix[@]} #Number of elements in the array
echo ${#Unix} #Number of characters in the first element of the array.i.e Debian
$./arraymanip.sh
4
6

5. Length of the nth Element in an Array


${#arrayname[n]} should give the length of the nth element in an array.
$cat arraymanip.sh
#! /bin/bash

Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${#Unix[3]} # length of the element located at index 3 i.e Suse

$./arraymanip.sh
4

6. Extraction by offset and length for an array


The following example shows the way to extract 2 elements starting from the position 3 from an array called
Unix.
$cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
echo ${Unix[@]:3:2}

$./arraymanip.sh
Suse Fedora

The above example returns the elements in the 3rd index and fourth index. Index always starts with zero.

7. Extraction with offset and length, for a particular element of an array


To extract only first four elements from an array element . For example, Ubuntu which is located at the second
index of an array, you can use offset and length for a particular element of an array.
$cat arraymanip.sh
#! /bin/bash

Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');


echo ${Unix[2]:0:4}

./arraymanip.sh
Ubun

The above example extracts the first four characters from the 2nd indexed element of an array.

8. Search and Replace in an array elements

The following example, searches for Ubuntu in an array elements, and replace the same with the word ‘SCO

3 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Unix’.
$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');

echo ${Unix[@]/Ubuntu/SCO Unix}

$./arraymanip.sh
Debian Red hat SCO Unix Suse Fedora UTS OpenLinux

In this example, it replaces the element in the 2nd index ‘Ubuntu’ with ‘SCO Unix’. But this example will not
permanently replace the array content.

9. Add an element to an existing Bash Array


The following example shows the way to add an element to the existing array.
$cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Unix=("${Unix[@]}" "AIX" "HP-UX")
echo ${Unix[7]}

$./arraymanip.sh
AIX

In the array called Unix, the elements ‘AIX’ and ‘HP-UX’ are added in 7th and 8th index respectively.

10. Remove an Element from an Array

unset is used to remove an element from an array.unset will have the same effect as assigning null to an element.
$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');

unset Unix[3]
echo ${Unix[3]}

The above script will just print null which is the value available in the 3rd index. The following example shows
one of the way to remove an element completely from an array.
$ cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
pos=3
Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))})
echo ${Unix[@]}

$./arraymanip.sh
Debian Red hat Ubuntu Fedora UTS OpenLinux

In this example, ${Unix[@]:0:$pos} will give you 3 elements starting from 0th index i.e 0,1,2 and ${Unix[@]:4}
will give the elements from 4th index to the last index. And merge both the above output. This is one of the
workaround to remove an element from an array.

11. Remove Bash Array Elements using Patterns

In the search condition you can give the patterns, and stores the remaining element to an another array as shown
below.

4 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

$ cat arraymanip.sh
#!/bin/bash
declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora');
declare -a patter=( ${Unix[@]/Red*/} )
echo ${patter[@]}

$ ./arraymanip.sh
Debian Ubuntu Suse Fedora

The above example removes the elements which has the patter Red*.

12. Copying an Array


Expand the array elements and store that into a new array as shown below.
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Linux=("${Unix[@]}")
echo ${Linux[@]}

$ ./arraymanip.sh
Debian Red hat Ubuntu Fedora UTS OpenLinux

13. Concatenation of two Bash Arrays


Expand the elements of the two arrays and assign it to the new array.
$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');

UnixShell=("${Unix[@]}" "${Shell[@]}")
echo ${UnixShell[@]}
echo ${#UnixShell[@]}

$ ./arraymanip.sh
Debian Red hat Ubuntu Suse Fedora UTS OpenLinux bash csh jsh rsh ksh rc tcsh
14

It prints the array which has the elements of the both the array ‘Unix’ and ‘Shell’, and number of elements of the
new array is 14.

14. Deleting an Entire Array

unset is used to delete an entire array.


$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');

UnixShell=("${Unix[@]}" "${Shell[@]}")
unset UnixShell
echo ${#UnixShell[@]}

$ ./arraymanip.sh
0

After unset an array, its length would be zero as shown above.

5 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

15. Load Content of a File into an Array


You can load the content of the file line by line into an array.
#Example file
$ cat logfile
Welcome
to
thegeekstuff
Linux
Unix

$ cat loadcontent.sh
#!/bin/bash
filecontent=( `cat "logfile" `)

for t in "${filecontent[@]}"
do
echo $t
done
echo "Read file content!"

$ ./loadcontent.sh
Welcome
to
thegeekstuff
Linux
Unix
Read file content!

In the above example, each index of an array element has printed through for loop.

Recommended Reading

Bash 101 Hacks, by Ramesh Natarajan. I spend most of my time on Linux environment.
So, naturally I’m a huge fan of Bash command line and shell scripting. 15 years back, when I was working on
different flavors of *nix, I used to write lot of code on C shell and Korn shell. Later years, when I started
working on Linux as system administrator, I pretty much automated every possible task using Bash shell
scripting. Based on my Bash experience, I’ve written Bash 101 Hacks eBook that contains 101 practical
examples on both Bash command line and shell scripting. If you’ve been thinking about mastering Bash, do
yourself a favor and read this book, which will help you take control of your Bash command line and shell
scripting.

66 Tweet Like 110 > Add your comment

If you enjoyed this article, you might also like..

6 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

1. 50 Linux Sysadmin Tutorials Awk Introduction – 7 Awk Print Examples


2. 50 Most Frequently Used Linux Commands (With Advanced Sed Substitution Examples
Examples) 8 Essential Vim Editor Navigation
3. Top 25 Best Linux Performance Monitoring and Fundamentals
Debugging Tools 25 Most Frequently Used Linux IPTables
4. Mommy, I found it! – 15 Practical Linux Find Rules Examples
Command Examples Turbocharge PuTTY with 12 Powerful
5. Linux 101 Hacks 2nd Edition eBook Add-Ons

Tagged as: Bash Array String, Bash Arrays, Bash Script Array, Bash Scripting Tutorial, Bash Tutorial, Echo
Array, Linux Array, Unix Array

{ 59 comments… add one }

Tanmay Joshi June 3, 2010, 5:59 am

Good article.

I am new to linux and following your articles very closely.


Just wanted to confirm if the below line as typo in displaying code or the sentence it self
“declare -a declares an array and all the elements in the curly brackets are the elements of an array” – are
we using curly brackets or parantheses?

Thanks,
Tanmay

Link
Gabriele June 3, 2010, 6:47 am

Great stuff!!!
Regards

Gabriele

Link
iambryan June 3, 2010, 8:52 am

Great examples

7 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

There is a correction for number 6 though as the OpenLinux array entity is missing the closing single quote
which would as you know, throw an error.

Keep up the good work

Link
Ramesh Natarajan June 3, 2010, 10:11 pm

@Tanmay, @Bryan,

Thanks for pointing out the issues. They are fixed now.

Link
hari June 3, 2010, 11:50 pm

best best

best

Link
Chris F.A. Johnson June 4, 2010, 8:01 am

1. “echo ${Unix[1]}” will not necessarily print element 1 from the array. For example:

$ Unix[1]=” AAA BBB CCC”


$ echo ${Unix[1]}
AAA BBB CCC

Leading and trailing whitespace will be lost, and consecutive whitespace will be reduced to a single space.

It should be:

echo “${Unix[1]}”

(Almost all the examples exhibit the same error because the variable reference is not quoted. Whether the
error is manifest in the output depends on the contents of the array elements.)

2. “declare -a” is unnecessary

3. “echo ${Unix[@]}” has the same problem as #1

4. More accurately, ${#arrayname[@]} gives you the number of elements in the array.

9. Since bash3, elements can also be appended to an array with “+=”:

Unix+=( “AIX” “HP-UX” )

15. filecontent=( `cat “logfile” `)

More efficient, as it doesn’t require an external command, is:

filecontent=( `< "logfile" `)

(Note: this doesn't read the file line by line; it reads it word by word. Try it on a file with more than one
word on a line.)

8 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Since bash4, this can be done even more efficiently with the mapfile builtin:

mapfile -t filecontent < "$logfile"

for t in "${filecontent[@]}"

The loop is not necessary:

printf "%s\n" "${filecontent[@]}"

Link
anonymous June 4, 2010, 10:01 pm

Note that the example will not read the following file into an array (where each line is an element).
This is the first line
This is the second line
This is the final line
To read the file (as lines) into an array do:
{
IFS=$’\n’
array_name=( $(cat filename) )
}
Note the use of the “{” in this example allows the changing of IFS value without having to save it and
restore it.

Link
TheFu June 7, 2010, 9:36 am

I love it! Great examples to display simple use cases.

Sadly, the syntax for arrays in Bash is too complex for me, so I’ll be staying with Perl. How often do you
hear that? I’ll probably be back here when perl isn’t allowed on a system for some reason.

Link
sbaginov June 9, 2010, 4:47 am

Simply awsome! Thank you!

Link
WaS June 21, 2010, 3:36 am

When you do:

filecontent=( `cat “logfile” `)

and logfile have one “*” you get a list of archives in your directory, how i can solve it?

Thx

Link
Chris F.A. Johnson June 21, 2010, 11:34 am

WaS, when you do that, $logfile will contain just an asterisk (*).

If you want to display that asterisk, you must quote the variable reference or the wildcard will be

9 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

expanded:

printf “%s\n” “$logfile”

Or:

echo “$logfile”

(Always quote variable references unless you have a good reason not to.)

Link
Toni Kukul October 8, 2010, 5:47 pm

To read a file into an array it’s possible to use the readarray or mapfile bash built-ins.
readarray < filename
or
mapfile < filename

File is read into MAPFILE variable by default.

Link
Anderson Venturini February 28, 2012, 6:08 am

Thanks a lot! Great tutorial! It was very useful! Congrats!

Link
ak March 11, 2012, 10:50 am

Good Examples. Thank you for hard work and clear explanations. Error in number 12: Suse is omitted
from the copied array.

Link
Vivek May 30, 2012, 8:07 pm

Hi,

I need to use cntrC inside my shell script. Here is an example:



run some commands
cntLc
run some more commands

How can I have my shell script generate cntrC without me typing cnrlC?

Vivek.

Link
Chris F.A. Johnson May 31, 2012, 12:21 pm

Vivek, what do you really want to do?

Link
Vivek May 31, 2012, 8:54 pm

10 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Chris, I need to run a script which has a command which gives a running output. I need to change the
argument to that command for example from 1 to 10.
Example:
for a in $(seq 1 10)
do

done

Now gives a running output.


Now when a=1, the command is running.
I want to send cntrlC to the command so that ends after lets say 100 seconds and starts.

Vivek.

Link
Chris F.A. Johnson June 1, 2012, 12:23 pm

Vivek, what does this have to do with arrays?

for n in {1..10}
do
: whatever
done &

read && kill “$!”

Link
Dennis Dashkevich July 12, 2012, 3:09 pm

More accurately, the length of the Nth element in an array will give the statement with the N-1 index, i.e.
${#arrayname[N-1]}.

Thanks for the tutorial! It’s really great!

Link
h October 29, 2012, 1:25 am

white space in elements not getting eliminated even though quotes are used

Link
Josh January 2, 2013, 5:41 pm

How about “test to see if value is in array” example?

Below is a small function for achieving this. The search string is the first argument and the rest are the
array elements:

containsElement () {
local e
for e in “${@:2}”; do [[ “$e” == “$1” ]] && return 0; done
return 1
}
A test run of that function could look like:

$ array=(“something to search for” “a string” “test2000”)

11 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

$ containsElement “a string” “${array[@]}”


$ echo $?
0
$ containsElement “blaha” “${array[@]}”
$ echo $?
1

Link
Chris F.A. Johnson January 2, 2013, 7:23 pm

Josh, there’s no need for a loop:

arraycontains() #@ USAGE: arraycontains STRING ARRAYNAME [IFS]


{
local string=$1 array=$2 localarray IFS=${3:-:}
eval “localarray=( \”\${$array[@]}\” )”
case “$IFS${localarray[*]}$IFS” in
*”$IFS$string$IFS”*) return ;;
*) return 1 ;;
esac
}

Link
Chris F.A. Johnson January 8, 2013, 6:41 pm

I have posted a number of functions for manipulating arrays at http://cfajohnson.com/shell/arrays/

Link
Angelo January 23, 2013, 6:32 am

As a historical note: SuSE has a lower-case “u” and the rest upper-case because it originally stood for
“Software und System-Entwicklung”, meaning “Software and systems development”. (Ref:
http://en.wikipedia.org/wiki/SuSE)

Link
Angelo January 23, 2013, 9:34 am

I’m a fan of clear code that is easy to read, but was curious whether Mr. Johnson’s arraycontains method
had an efficiency benefit (in spite of its more obfuscated nature) over Josh’s (which is almost exactly the
method I had been using). I can’t get it to work at all. Maybe I’m missing something, but in case I’m not,
maybe I can save someone else the wasted effort in going down this same road.

Here is my test of Chris Johnson’s code:

#!/bin/bash
arraycontains() { #@ USAGE: arraycontains STRING ARRAYNAME [IFS]
local string=$1 array=$2 localarray IFS=${3:-:}
eval “localarray=( \”\${$array[@]}\” )”
case “$IFS${localarray[*]}$IFS” in
*”$IFS$string$IFS”*) return ;;
*) return 1 ;;
esac
}

12 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

echo -en “String test 1: ”


one=(“and” “this” “is” “another” “test”)
if arraycontains “something” “${one[@]}”
then
echo “TRUE, but should be FALSE”
else
echo “OK”
fi

echo -en “String test 2: ”


if arraycontains “another” “${one[@]}”
then
echo “OK”
else
echo “FALSE, but should be TRUE”
fi

echo -en “Numeric test: ”


two=(1 2 3 4 5)
arraycontains “5” “${two[@]}”
echo $?

echo -en “Quoted-numeric test: ”


three=(“1” “2” “3” “4” “5”)
arraycontains “6” “${three[@]}”
echo $?

Here is the output:

$ sh test-contains.sh
String test 1: OK
String test 2: FALSE, but should be TRUE
Numeric test: ./test-contains.sh: line 4: ${1[@]}: bad substitution
1
Quoted-numeric test: ./test-contains.sh: line 4: ${1[@]}: bad substitution
1

Besides giving the error message when passed a numeric array, it always returns FALSE (1). On
investigation I discovered that the “eval” line is not working; localarray is always blank (so no wonder it
always returns false).

I ran this script with BASH 3.00.16 and 4.2.20 and got the same result.

Link
Heriel Uronu@udom April 30, 2013, 7:18 am

yeah… am well and much clear on array in linux command..


wel done stay blessed,

Link
x31eq July 17, 2013, 10:49 am

The second part of Example 10 is especially wrong because of the quoting issue. It means ${Unix[1]} is
Red instead of Red hat. The correct way is

13 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Unix=(“${Unix[@]:0:$pos}” “${Unix[@]:$(($pos + 1))}”)

Link
Hans November 29, 2013, 1:49 pm

The best guide on Bash arrays I have ever found!

Thank you.

Link
mug896 January 2, 2014, 6:31 am

To read the file as lines into an array use double quote

fileContents=( “$(cat sunflower.html)” )

for line in “${fileContents[@]}”


do
echo “$line”
done

Link
Chris F.A. Johnson January 2, 2014, 11:57 am

mug896,
That will not read the file line by line; it will read it word by word. All whitespace in the file will act as
delimiters.

And you don’t need a loop to print out the array:

printf ‘%s\n’ “${fileContents[@]}”

Link
Chris F.A. Johnson January 2, 2014, 2:10 pm

My mistake, mug896; your code will read the file into a single element of the array. You can see that by:

printf ‘%s\n’ “${fileContents[0]}”

If you had done

fileContents=( $(cat sunflower.html) ) ## no quotes

It would have read each word into a separate element of the array.

Link
Offirmo January 9, 2014, 8:21 am

Very nice, but “iteration on an array” is missing !

Link
Erick January 24, 2014, 5:43 pm

Thanks a lot!

14 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Link
Robert Vila February 23, 2014, 10:57 pm

What do you do when a bash script doesn’t accept arrays?

Error messages:
>>>> “declare: not found”
or
>>>> “Unix[0]=Debian: not found”

Link
Chris F.A. Johnson February 25, 2014, 3:14 pm

Robert, make sure you are using bash to interpret the script.

Link
Robert Mark Bram February 27, 2014, 8:00 pm

Your second example in “10. Remove an Element from an Array” is wrong because you are not enclosing
the array parts in quotes – so ‘Red Hat’ becomes two elements.

Here it is fixed up with proofs.

Fri Feb 28 – 12:53 PM > Unix=(‘Debian’ ‘Red hat’ ‘Ubuntu’ ‘Suse’ ‘Fedora’ ‘UTS’ ‘OpenLinux’);
Fri Feb 28 – 12:53 PM > echo ${#Unix[@]}
7
Fri Feb 28 – 12:53 PM > pos=3
Fri Feb 28 – 12:53 PM > echo ${Unix[$pos]}
Suse
Fri Feb 28 – 12:53 PM > Unix=(“${Unix[@]:0:$pos}” “${Unix[@]:$(($pos + 1))}”)
Fri Feb 28 – 12:53 PM > echo ${Unix[$pos]}
Fedora
Fri Feb 28 – 12:53 PM > echo ${Unix[@]}
Debian Red hat Ubuntu Fedora UTS OpenLinux
Fri Feb 28 – 12:53 PM > echo ${#Unix[@]}
6
Fri Feb 28 – 12:53 PM > for index in “${!Unix[@]}” ; do printf “%4d: %s\n” $index “${Unix[$index]}” ;
done
0: Debian
1: Red hat
2: Ubuntu
3: Fedora
4: UTS
5: OpenLinux

Link
ian fleming March 13, 2014, 12:37 pm

An alternate, perhaps simpler, method for removing an element, is to reassign Unix (making sure we
include the quotes, as per previous post) from the remaining elements in the array (after unsetting):
unset Unix[2]
Unix=( “${Unix[@]” )

Example:

15 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

—– $ Unix=(‘Debian’ ‘Red Hat’ ‘Ubuntu’ ‘SuSE’);


—– $ echo “len: ${#Unix[@]}”; for ((i=0;i<4;i++)); do printf "%d %s\n" $i "${Unix[$i]}"; done
len: 4
0 Debian
1 Red Hat
2 Ubuntu
3 SuSE
—– $ unset Unix[2]
—– $ echo "len: ${#Unix[@]}"; for ((i=0;i<4;i++)); do printf "%d %s\n" $i "${Unix[$i]}"; done
len: 3
0 Debian
1 Red Hat
2
3 SuSE
—– $ Unix=( "${Unix[@]}" )
—– $ echo "len: ${#Unix[@]}"; for ((i=0;i<4;i++)); do printf "%d %s\n" $i "${Unix[$i]}"; done
len: 3
0 Debian
1 Red Hat
2 SuSE
3

(note that my loop runs past the end of the array after shortening it )

Link
Choperro April 15, 2014, 5:43 pm

>>>There is no “DECLARED” maximum limit to the size of an array, …..

Link
Choperro April 16, 2014, 3:03 pm

I need to quote, don’t you?


Unix=( “${Unix[@]:0:$pos}” “${Unix[@]:$(($pos + 1)” )})

Link
Choperro April 16, 2014, 3:24 pm

Also. in 11
declare -a patter=( “${Unix[@]/Red*/}” )
It doesn’t remove array elements, it removes the first occurrence that satisfies the regular expression inside
each element in the array.

Link
Dan May 19, 2014, 2:01 pm

Choperro, actually:
declare -a patter=( “${Unix[@]/Red*/}” )
Removes all occurrences that satisfies the regular expression inside each element in the array.

$ Unix=(‘Debian’ ‘Red hat’ ‘Red Hat 2’ ‘Red Hat 3’ ‘Ubuntu’ ‘Suse’ ‘Fedora’ ‘UTS’ ‘OpenLinux’);

$ patter=( ${Unix[@]/Red*/} )

16 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

$ echo ${patter[@]}
Debian Ubuntu Suse Fedora UTS OpenLinux

Link
Xiaoning June 14, 2014, 1:25 pm

Thanks for a great tutorial!

I have a txt file with a list of directories that I hope to cd into, and do the same stuff for all of them.
Suppose it look like this:

“/path/to/first/dir”
“/path/to/second/dir”
“/path/to/third/dir/with space”

I try to use the code in your Example 15 for my purpose:

#!/bin/bash
DIR=( `cat “$HOME/path/to/txt.txt” `)
for t in “${DIR[@]}”
do
echo “$t”
done
echo “Done!”

The above script worked fine for the first and second directory, but the third one will output this:

“/path/to/third/dir/with
space”

Instead of in one line. How can I fix that?

Also, if I add cd command in the above script:

#!/bin/bash
DIR=( `cat “$HOME/path/to/txt.txt” `)
for t in “${DIR[@]}”
do
echo “$t”
cd “$t”
done
echo “Done!”

All the cd command would fail, the output looks like this:

“/path/to/first/dir”
test.sh: line 6: cd: “/path/to/first/dir”: No such file or directory
“/path/to/second/dir”
test.sh: line 6: cd: “/path/to/second/dir”: No such file or directory
“/path/to/third/dir/with
test.sh: line 6: cd: “/path/to/third/dir/with: No such file or directory
space”
test.sh: line 6: cd: space”: No such file or directory

17 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Could you shed some light on why this happened and how should I fix it? Thank you very much!

Link
Chris F.A. Johnson June 19, 2014, 8:45 pm

>> DIR=( `cat “$HOME/path/to/txt.txt” `)

That is always the wrong way to read a file; it reads it word by word not line by line.

In bash4, the easy way is to use mapfile:

mapfile -t dir < "$filename"

Link
Xiaoning June 20, 2014, 7:06 am

Hi Chris,

Thank you for the reply!

I changed my code to use the mapfile line you suggested.

But when I run the script, this is what I got:

./test.sh: line 3: mapfile: command not found

Any ideas? Thank you!

Link
ian fleming June 20, 2014, 4:12 pm

Ran into that recently porting some scripts from RedHat to Apple OS X Mavericks. Not all bash’s support
mapfile (aka readarray); it’s there in RedHat, but not in Apple’s OS X. type “man mapfile” ; if it says “No
manual entry” then your system probably doesn’t have mapfile implemented. In that case, you may need
to do something like the following (someone smarter than me may have a better solution):

i=0
while read line
do
dir[$((i++))]=$line # store $line in dir[$i] and increment $i
...
done < $HOME/path/to/txt.txt

Link
Chris F.A. Johnson June 20, 2014, 5:00 pm

mapfile was introduced in bash4 — more than 5 years ago.

Upgrgade your bash; it’s long overdue.

Link
Xiaoning June 20, 2014, 8:16 pm

I just check my bash version in Mac OS X Mavericks:


GNU bash, version 4.3.11(1)-release (x86_64-apple-darwin13.1.0)

18 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Should it have mapfile?

Link
Xiaoning June 20, 2014, 8:22 pm

I also tried the read line method Ian suggested. Thanks Ian btw!

However, I still ran into the same issue that all the “echo” command gave the correct results, but I can’t cd
into all the directories.

Bash returned: “./test.sh: line 14: cd: “/Users/xiaoning/some/path”: No such file or directory”

Link
ian fleming June 20, 2014, 10:57 pm

Bash 4.3.xx does have mapfile. However, OS X Mavericks’ version of bash, which should be located in
/bin/bash, is 3.2.xx . I suspect you have a 2nd version of bash installed, and this is getting invoked as your
startup shell. (A likely location is /opt/local/bin/bash, which is where macports installs it if it is needed by
any program installed by macports. Fink may do the same.)

Your reported version of bash, 4.3, should have mapfile, but /bin/bash under OS X does not, and your
script specifies to run under /bin/bash (1st line of script). To use 4.3 in your script, Find where the bash
you are running (“which bash” may tell you), and change the first line of your script to invoke that bash.
For example (using my example):

#!/opt/local/bin/bash

Regarding why your script cannot cd to “/Users/xiaoning/some/path” , I have no good explanation,


assuming “/Users/xiaoning/some/path” does exist. The command

ls -ld “/Users/xiaoning/some/path”

(from the command line) will verify that the directory exists.

Link
Xiaoning Wang June 21, 2014, 11:53 am

mapfile is working now after changing the #! line to the macport bash I have installed.

Those are all valid directories that I can normally ls, or cd into. But the script for some reason is still not
working…

The script I’m using now is to directly store the array of directories in a variable, and it worked just fine.
However, when I try to read the same array from a file, it’s no longer working. Very strange…

Link
DC August 8, 2014, 10:11 am

how to remove lines containing any one of an array of strings from multiple files?

Link
jim October 28, 2014, 1:28 am

Using sed, write a script that takes a filename and a pattern to do the following.
If the given pattern exists in the file with the very next line starting and ending with the same pattern,

19 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

delete the line that starts and ends with the given pattern. please help

Link
Yves B April 24, 2015, 7:02 am

Thanks for tip no15. “Load Content of a File into an Array”. Exactly what I was looking for.

Link
John Allsup June 1, 2015, 4:56 am

Care needs to be taken with quotes, both in general, and especially when playing with arrays. The
following is a simple bash script that collects together working examples of the things you demonstrate
above. Note that the file hx used at the end just contains a few lines of text, some of which contain spaces.

#!/bin/bash

declare -a A
A[3]=flibble
echo “$A[3]” might be flibble, the third item, but isnt
echo “${A[3]}” should be flibble, the third item, note the braces
echo “${A[@]}” is contents of array
echo “${#A[@]}” is length of array
echo “${#A[3]}” should be 7, length of flibble
echo “${A[3]:2:3}” should be ibb, the three characters starting at pos 2
echo “${A[@]/ibb/bone}” is search and replace for each item
A=(“${A[@]}” “wibble”)
echo A is now “${A[@]}”
echo now
declare -a B=(“${A[@]}”)
echo Third item is “${B[3]}”
echo Zeroth item is “${B[0]}”
echo So copying arrays this way does not preserve string keys — it reindexes
declare -a C
C[wibble]=wobble
echo “${C[wibble]}” shows keys are strings, not contiguous integers
declare -a D
D=(“a b c d e” “c d f t g”)
echo D is “${D[@]}”
echo Length of D is “${#D[@]}”
echo Length of “D[0]” is “${#D[0]}”
echo “D[0] is ‘${D[0]}'”
declare -a E=( ${D[@]} )
echo E is “${E[@]}”
echo Length of E is “${#E[@]}”
echo Length of “E[0]” is “${#E[0]}”
echo “E[0] is ‘${E[0]}'”
declare -a F=( ${D[@]/a*/} )
echo F is “${F[@]}”
echo Length of F is “${#F[@]}”
echo Length of “F[0]” is “${#F[0]}”
echo “F[0] is ‘${F[0]}'”
declare -a G=( “${D[@]/a*/}” )
echo G is “${G[@]}”

20 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

echo Length of G is “${#G[@]}”


echo Length of “G[0]” is “${#G[0]}”
echo “G[0] is ‘${G[0]}'”
echo Note in the above what happens with spaces
echo To concatenate two arrays, preserving spaces, use double quoting
declare -a H=(“${A[@]}” “${D[@]}”)
declare -a I=(${A[@]} ${D[@]})
echo To delete an array use unset
echo I is “${I[@]}”
unset I
echo I is now “${I[@]}”
echo reading from a file
px() {
for s; do echo “$s”; done
}
echo version 1
declare -a I=(`cat hx`)
px “${I[@]}”
echo version 2
declare -a I=(“`cat hx`”)
px “${I[@]}”

Link
Griff November 6, 2015, 11:04 am

+1 on x31eq’s comment about the quoting. It also means the value of ${#Unix[@]} is wrong. It would be
great if you could correct this.

Link
Sam April 28, 2016, 5:37 pm

I have a created 2 arrays A, B from command output

A=(`command1`) ## This contains filenames


B=(`command2`) ## This contains DB names

Now I am issuing command3 using the above arrays

Example: unzip $A | mysql -u root -p $B ## Here the problem is it executes the ‘A’ portion for each of the
‘B’ elements

How do i solve this?

Link
srinivas May 25, 2016, 11:49 pm

Hi,

I have single item ‘red hat’ in array like array[‘red hat’]. I want split the array from single index to 2
indexes like array[‘red’ ‘hat’].please suggest me with a solution

Link
Sneha June 20, 2016, 11:54 pm

21 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Hi,

I am trying to get the table value in an array.


Say, there is a tbl with col1, col2, col3 having values ‘abc’, ‘def’, ‘ghi jkl’.
There is a function that I use to get these values from my Table to a variable say DBVAL, which is echoed
from the function.
Now I want to assign each of these column values to different index of an array.
currently the command I use is:
declare -a arrayname=($(function_that_gets_value_from_table))

but if I do:
echo ${#arrayname[@]}
it gives: 4 instead of 3

and
for arr in “${arrayname[@]}”; do; echo “$arr”; done
gives:
abc
def
‘ghi
jkl’
instead of:
abc
def
ghi jkl

Even:
arrayname=( $DBVAL )
does not work.

Although, if I declare the array with the hardcoded values (not get it from function/from any variable),
then it works fine.
declare -a arrayname=(‘abc’ ‘def’ ‘ghi jkl’)
echo ${#arrayname[@]}
gives: 3

for arr in “${arrayname[@]}”; do; echo “$arr”; done


gives:
abc
def
ghi jkl

Please help.

Link
Gulab June 27, 2016, 7:25 am

how to import multiple directory in array in runtime and check if directory is present or not ?

Link

Leave a Comment

Name

22 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Email

Website

Comment

Notify me of followup comments via e-mail

Next post: Lzma Vs Bzip2 – Better Compression than bzip2 on UNIX / Linux

Previous post: VMware Virtualization Fundamentals – VMware Server and VMware ESXi

RSS | Email | Twitter | Facebook | Google+

Search

EBOOKS

Linux 101 Hacks 2nd Edition eBook - Practical Examples to Build a Strong Foundation in Linux
Bash 101 Hacks eBook - Take Control of Your Bash Command Line and Shell Scripting
Sed and Awk 101 Hacks eBook - Enhance Your UNIX / Linux Life with Sed and Awk
Vim 101 Hacks eBook - Practical Examples for Becoming Fast and Productive in Vim Editor
Nagios Core 3 eBook - Monitor Everything, Be Proactive, and Sleep Well

23 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Be the first of your friends to like this

POPULAR POSTS

12 Amazing and Essential Linux Books To Enrich Your Brain and Library
50 UNIX / Linux Sysadmin Tutorials
50 Most Frequently Used UNIX / Linux Commands (With Examples)
How To Be Productive and Get Things Done Using GTD
30 Things To Do When you are Bored and have a Computer
Linux Directory Structure (File System Structure) Explained with Examples
Linux Crontab: 15 Awesome Cron Job Examples
Get a Grip on the Grep! – 15 Practical Grep Command Examples
Unix LS Command: 15 Practical Examples
15 Examples To Master Linux Command Line History
Top 10 Open Source Bug Tracking System
Vi and Vim Macro Tutorial: How To Record and Play
Mommy, I found it! -- 15 Practical Linux Find Command Examples
15 Awesome Gmail Tips and Tricks
15 Awesome Google Search Tips and Tricks
RAID 0, RAID 1, RAID 5, RAID 10 Explained with Diagrams
Can You Top This? 15 Practical Linux Top Command Examples
Top 5 Best System Monitoring Tools
Top 5 Best Linux OS Distributions
How To Monitor Remote Linux Host using Nagios 3.0
Awk Introduction Tutorial – 7 Awk Print Examples
How to Backup Linux? 15 rsync Command Examples
The Ultimate Wget Download Guide With 15 Awesome Examples
Top 5 Best Linux Text Editors
Packet Analyzer: 15 TCPDUMP Command Examples
The Ultimate Bash Array Tutorial with 15 Examples
3 Steps to Perform SSH Login Without Password Using ssh-keygen & ssh-copy-id
Unix Sed Tutorial: Advanced Sed Substitution Examples
UNIX / Linux: 10 Netstat Command Examples
The Ultimate Guide for Creating Strong Passwords
6 Steps to Secure Your Home Wireless Network
Turbocharge PuTTY with 12 Powerful Add-Ons

CATEGORIES

Linux Tutorials

24 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Vim Editor
Sed Scripting
Awk Scripting
Bash Shell Scripting
Nagios Monitoring
OpenSSH
IPTables Firewall
Apache Web Server
MySQL Database
Perl Programming
Google Tutorials
Ubuntu Tutorials
PostgreSQL DB
Hello World Examples
C Programming
C++ Programming
DELL Server Tutorials
Oracle Database
VMware Tutorials

About The Geek Stuff

My name is Ramesh Natarajan. I will be posting instruction guides, how-to, troubleshooting tips
and tricks on Linux, database, hardware, security and web. My focus is to write articles that will either teach you
or help you resolve a problem. Read more about Ramesh Natarajan and the blog.

Contact Us

Email Me : Use this Contact Form to get in touch me with your comments, questions or suggestions about this
site. You can also simply drop me a line to say hello!.

Follow us on Google+

Follow us on Twitter

Become a fan on Facebook

Support Us

25 of 26 9/30/2016 7:27 AM
The Ultimate Bash Array Tutorial with 15 Examples http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Support this blog by purchasing one of my ebooks.

Bash 101 Hacks eBook

Sed and Awk 101 Hacks eBook

Vim 101 Hacks eBook

Nagios Core 3 eBook

Copyright © 2008–2015 Ramesh Natarajan. All rights reserved | Terms of Service

26 of 26 9/30/2016 7:27 AM

You might also like