Indexed Arrays
We start with simple indexed arrays in bash. You can define an indexed array by using parentheses and assignment operator. Lets say you wish to store names of months in months
variable as an array. Here is how you will do it in bash.
months=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
Bash arrays start with the index 0
so to retrieve the value for October we will use index 9
, as in the following code.
months=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
echo ${months[9]}
# Output: Oct
index=5
echo ${months[$index]}
#Output: Jun
Make sure to use curly braces when accessing an element through index.
Bash allow use of special characters to get all values and indexes of an array at once. Use *
or @
to get all values stored in an array and !
before array name to get all indexes. And to get length of an array use #
.
months=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
# Get all values from months array
echo ${months[*]}
# or echo ${months[@]}
# Output: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
# Get all indexes
echo ${!months[@]}
# or echo ${!months[*]}
# Output: 0 1 2 3 4 5 6 7 8 9 10 11
# Length of array
echo ${#months[@]}
# or echo ${#months[*]}
# Output: 12
You can easily append data to an existing indexed array using +=
operator or you can specify the index by your own.
months=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
# Add to the months array
months+=("Raj" "Sha" "Ra1" "Ra2")
echo ${months[@]}
# Output: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Raj Sha Ra1 Ra2
# Add element to any specified index
months[20]="Muh"
echo ${months[@]}
# Output: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Raj Sha Ra1 Ra2 Muh
# Get all indexes
echo ${!months[@]}
# Output: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 20
# Initialize second array
animals=("Cow" "Goat" "Horse" "Lion" [11]="Brock Lesnar")
# Get all indexes for animals
echo ${!animals[@]}
# Output: 0 1 2 3 11
Notice that you can specify an index out of order as well and bash will take care of it. As it can be seen that we have added Muh
at the 20th
index and it worked just fine. Also, while initiating animals
array we changed the indexing deliberately and it also worked without any error.
Keep note that negative indexes are not allowed.
Associative Arrays or Hashes
Bash also supports hashes that is storing data as key => value
pair. You can all it associative array if you are coming from PHP
background or dictionary in Python
.
We can declare a variable to be an associative array by using declare -A <variable name>
command. We can also initialize it using parentheses at the time of declaration.
declare -A stars=([ALP]="Cow" [BET]="Bow" [GAM]="Goat" [DEL]="Scorpion"
[EPS]="Balance" [ZET]="Queen" [ETA]="Lion" [THE]="Fish")
# OR
declare -A planets
planets["first"]="Mercury"
planets["second"]="Venus"
planets["third"]="Earth"
planets["Musk adventure"]="Mars"
planets["second last"]="Uranus"
We can access the keys and values of an associative array in a similar fashion as of indexed arrays.
We will print the key value pairs of an associative array using for loop to conclude this topic.
declare -A stars=([ALP]="Cow" [BET]="Bow" [GAM]="Goat" [DEL]="Scorpion"
[EPS]="Balance" [ZET]="Queen" [ETA]="Lion" [THE]="Fish")
for key in ${!stars[@]}; do
echo "$key => ${stars[$key]}"
done
# Output
# GAM => Goat
# EPS => Balance
# ALP => Cow
# ZET => Queen
# DEL => Scorpion
# BET => Bow
# ETA => Lion
# THE => Fish
# Get length of stars
echo ${#start[@]}
# Output: 8
That's it for Arrays in bash from my side.
I hope it will help you. Keep Coding!
Top comments (3)
This syntax is so terse it makes it hard to follow without your descriptions. Thanks for sharing, I will definitely reference this if I have any bash array needs.
Thanks Walker. Bash arrays are very useful utility for System Administrators in automation tasks.
Thanks for sharing.
Report : some syntax error on 'echo ${#start[@]}'
seems to me ?
shouldn't it be 'echo ${#stars[I@]}'
I love astronomy, BTW ! xD