EN
Bash - create 2D array
7
points
In this short article, we would like to show how to create 2D array in Bash.
By default Bash doesn't support 2D arrays, but there is some trick that lets to achieve the effect.
Quick solution (address array with ${array[row_index * columns_count + column_index]}):
#!/bin/bash
columns_count=2
array=(
# [column 0] [column 1]
a b
c d
e f
)
items_count=${#array[*]}
rows_count=$((items_count / columns_count))
echo "Array size: $rows_count x $columns_count"
row_index=2
column_index=1
echo "Array item: ${array[row_index * columns_count + column_index]}"
Output:
Array size: 3 x 2
Array item: f
Note: in the array, white characters between items are ignored, so to add item with multiple words wrap it with
"".e.g.
array=( # [column 1] [column 2] "a item" "b item" "c item" "d item" "e item" "f item" )
Practical example
In the below example we use a users list that contains rows with two columns: username and email.
#!/bin/bash
columns_count=2
users=(
# [column 0] [column 1 ]
#
john john@mail.com
ann ann@mail.com
matt matt@mail.com
)
items_count=${#users[*]}
rows_count=$((items_count/ columns_count))
echo "Users count: $rows_count"
echo
for (( i = 0; i < rows_count; ++i ))
do
row_number=$((i + 1))
echo "$row_number. ${users[i * columns_count + 0]} ${users[i * columns_count + 1]}"
done
Output:
Users count: 3
1. john john@mail.com
2. ann ann@mail.com
3. matt matt@mail.com