Array Operations
Learn advanced array operations including searching, sorting, filtering, and transforming arrays in bash.
Joining Array Elements
#!/bin/bash
FRUITS=("apple" "banana" "cherry")
# Join with delimiter
join_by() {
local IFS="$1"
shift
echo "$*"
}
echo $(join_by ',' "${FRUITS[@]}") # apple,banana,cherry
echo $(join_by ' | ' "${FRUITS[@]}") # apple | banana | cherry
# Simple join with printf
printf '%s,' "${FRUITS[@]}" # apple,banana,cherry,
Splitting String into Array
#!/bin/bash
STR="apple,banana,cherry"
# Using IFS
IFS=',' read -ra FRUITS <<< "$STR"
echo "${FRUITS[0]}" # apple
echo "${FRUITS[1]}" # banana
# Using parameter expansion
STR2="one:two:three"
PARTS=(${STR2//:/ }) # Replace : with space, then split
echo "${PARTS[@]}"
Exercise: Split and Join
Convert between string and array:
Searching Arrays
#!/bin/bash
FRUITS=("apple" "banana" "cherry" "date")
# Check if contains (linear search)
contains() {
local needle="$1"
shift
for item in "$@"; do
[[ "$item" == "$needle" ]] && return 0
done
return 1
}
if contains "banana" "${FRUITS[@]}"; then
echo "Found!"
fi
# Find index of element
index_of() {
local needle="$1"
shift
local i=0
for item in "$@"; do
[[ "$item" == "$needle" ]] && echo $i && return
((i++))
done
echo -1
}
echo "banana is at index: $(index_of 'banana' "${FRUITS[@]}")"
Filtering Arrays
#!/bin/bash
NUMBERS=(1 2 3 4 5 6 7 8 9 10)
# Filter: keep even numbers
EVENS=()
for n in "${NUMBERS[@]}"; do
((n % 2 == 0)) && EVENS+=("$n")
done
echo "${EVENS[@]}" # 2 4 6 8 10
# Filter files by extension
FILES=(*.txt *.sh)
SCRIPTS=()
for f in "${FILES[@]}"; do
[[ "$f" == *.sh ]] && SCRIPTS+=("$f")
done
Mapping Arrays
Transform each element:
#!/bin/bash
NAMES=("alice" "bob" "charlie")
# Map: uppercase each
UPPER=()
for name in "${NAMES[@]}"; do
UPPER+=("${name^^}")
done
echo "${UPPER[@]}" # ALICE BOB CHARLIE
# Map: add prefix
PREFIXED=()
for name in "${NAMES[@]}"; do
PREFIXED+=("user_$name")
done
echo "${PREFIXED[@]}" # user_alice user_bob user_charlie
Exercise: Filter Array
Keep only matching elements:
Sorting Arrays
#!/bin/bash
FRUITS=("cherry" "apple" "banana" "date")
# Sort alphabetically
readarray -t SORTED < <(printf '%s\n' "${FRUITS[@]}" | sort)
echo "${SORTED[@]}" # apple banana cherry date
# Sort numerically
NUMS=(10 2 33 4 15)
readarray -t SORTED < <(printf '%s\n' "${NUMS[@]}" | sort -n)
echo "${SORTED[@]}" # 2 4 10 15 33
# Reverse sort
readarray -t SORTED < <(printf '%s\n' "${FRUITS[@]}" | sort -r)
echo "${SORTED[@]}" # date cherry banana apple
Removing Duplicates
#!/bin/bash
ITEMS=("apple" "banana" "apple" "cherry" "banana")
# Remove duplicates (preserves order)
declare -A seen
UNIQUE=()
for item in "${ITEMS[@]}"; do
if [[ ! -v seen["$item"] ]]; then
seen["$item"]=1
UNIQUE+=("$item")
fi
done
echo "${UNIQUE[@]}" # apple banana cherry
# Using sort -u (doesn't preserve order)
readarray -t UNIQUE < <(printf '%s\n' "${ITEMS[@]}" | sort -u)
Array Comparison
#!/bin/bash
A=(1 2 3)
B=(1 2 3)
C=(1 2 4)
# Compare arrays
arrays_equal() {
[[ "${1[*]}" == "${2[*]}" ]]
}
if [[ "${A[*]}" == "${B[*]}" ]]; then
echo "A and B are equal"
fi
if [[ "${A[*]}" != "${C[*]}" ]]; then
echo "A and C are different"
fi
Reversing Arrays
#!/bin/bash
ARR=(1 2 3 4 5)
# Reverse into new array
REVERSED=()
for ((i=${#ARR[@]}-1; i>=0; i--)); do
REVERSED+=("${ARR[$i]}")
done
echo "${REVERSED[@]}" # 5 4 3 2 1
# In-place reverse
reverse_array() {
local -n arr=$1
local temp
local len=${#arr[@]}
for ((i=0; i<len/2; i++)); do
temp="${arr[$i]}"
arr[$i]="${arr[$len-1-i]}"
arr[$len-1-i]="$temp"
done
}
Practical Example: Process Arguments
#!/bin/bash
POSITIONAL=()
VERBOSE=false
OUTPUT=""
while [[ $# -gt 0 ]]; do
case $1 in
-v|--verbose)
VERBOSE=true
shift
;;
-o|--output)
OUTPUT="$2"
shift 2
;;
*)
POSITIONAL+=("$1")
shift
;;
esac
done
echo "Positional args: ${POSITIONAL[@]}"
echo "Verbose: $VERBOSE"
echo "Output: $OUTPUT"
Key Takeaways
- Join with
IFSor custom function - Split strings with
IFS=',' read -ra - Filter by looping and conditionally adding
- Sort with
readarray -t SORTED < <(... | sort) - Remove duplicates with associative array or
sort -u - Compare arrays with
[[ "${A[*]}" == "${B[*]}" ]] - Use
readarray -tto capture command output into array - Bash 4+ features:
readarray,-vtest for set variables

