Arrays in Shell Back

Arrays may be initialized with variable[n] notation, and to access elements with curly bracket notation like $[variable[n]].

Initialization

# there is a convenient way of initializing an entire array
base64_charset=( {A..Z} {a..z} {0..9} + / = );

base64_charset=( [0]={A..Z} [1]={a..z} [2]={0..9} [3]=+ [4]=/ [5]== );

Notice that: declare -a statement to an array declaration may speed up execution of subsequent operations on the array:

declare -a bigOne=( /dev/* );           # All the files in /dev
declare -a bigTwo=( ${bigOne[@]} );

Notice that: any variables can have array operations, even if they are not explicitly declared as arrays:

#!/bin/bash

name=aleen
echo ${name[@]};        # => aleen
echo ${name[*]};        # => aleen
echo ${name[0]};        # => aleen
echo ${name[1]};        # => 

# array length
echo ${#name[@]};       # => 1

Operations

Add/Replace/Delete elements from an array:

#!/bin/bash

array=(zero one two three);

# add four to the array
array[4]=four;
echo ${array[@]};       # => zero one two three four

# replace three of the array
array[3]=replace_three;
echo ${array[@]};       # => zero one two replace_three four

# remove two from the array
unset array[2];
echo ${array[@]};       # => zero one replace_three four

# remove all elements
unset array;
echo ${array[@]};       # =>

If you want to read an element from an array, you can write like this:

#!/bin/bash

array=(zero one two three);

# get a specific element in an array
echo ${array[0]};       # => zero

# get a specific element and start at a specific position
echo ${array: 2};       # => ro
echo ${array[1]: 1};    # => ne

If you want to read some lengths like the length of the element or of the array:

#!/bin/bash

array=(zero one two three);

# get the length of the array
echo ${#array[*]};          # => 4
echo ${#array[@]};          # => 4

# get the length of the first item
echo ${#array};             # => 4
echo ${#array[0]};          # => 4

Trailing Substring Extraction:

#!/bin/bash

array=(zero one two three);

# read all elements
echo ${array[@]};           # => zero one two three
echo ${array[*]};           # => zero one two three
echo ${array[@]: 0};        # => zero one two three

# read elements started from the second
echo ${array[@]: 1};        # => one two three

# read first to third elemnt
echo ${array[@]: 0:2};      # => zer one two

Substring removals:

#!/bin/bash

array=(zero one two three four five five);

# removal of the shortest match from front of the string
echo ${array[@]#f*r};       # => zero one two three five five

# removal of the longest match from front of the string
echo ${array[@]##t*e};      # => zero one two four five five

# removal of the shortest match from front of the string
echo ${array[@]%h*e};       # => zero one two t four five five

# removal of the longest match from front of the string
echo ${array[@]%%t*e};      # => zero one two four five five

String replacement:

#!/bin/bash

array=(four fivefive);

# replace first occurence of substrings
echo ${array[@]/iv/XYZ};                    # => four fXYZefive

# replace all occurences of substrings
echo ${array[@]//iv/XYZ};                   # => four fXYZefXYZe

# delete first occurence of substrings
echo ${array[@]/iv/};                       # => four fefive

# delete all occurences of substrings
echo ${array[@]//iv/};                      # => four fefe

# replace front-end occurence of substrings
echo ${array[@]/#fi/XYZ};                   # => four XYZefive

# replace back-end occurence of substrings
echo ${array[@]/%ve/XYZ};                   # => four fivefiXYZ

Loading files to an array

#!/bin/bash

# read line from test.txt
# zero
# one
# two

# the first way
array=($(awk "{print $1}" "test.txt"));
echo $(array[*]);                           # => zero one two

# the second way
n=0;
while read a;
do
    array[$n]=$a;
    ((n++));
done<test.txt  
echo $(array[*]);                           # => zero one two

# the third way
n=1  
while ((n<=$(cat test.txt|wc -l)))  
do  
    array[$n]=$(cat test.txt|sed -n "${n}p"|awk '{print $1}');
    ((n+=1));
done
echo $(array[*]);                           # => zero one two

Empty arrays

#!/bin/bash

array0=( zero one two );
echo ${#array0[@]};                         # => 3

array1=("");
echo ${#array1[@]};                         # => 1

array2=();
echo ${#array2[@]};                         # => 0

array3=(  );
echo ${#array3[@]};                         # => 0

Array copying

#!/bin/bash

array_before=( zero one two three );

# Deep Copy
array_deep_copy=${array_before[@]};

echo Before: ${array_before[@]};            # => Before: zero one two three
echo Deep_Copy: ${array_deep_copy[@]};      # => Deep_Copy: zero one two three

array_before[4]=four;

echo Before: ${array_before[@]};            # => Before: zero one two three four
echo Deep_Copy: ${array_deep_copy[@]};      # => Deep_Copy: zero one two three

Array concatenation

#!/bin/bash

array_before=( zero one );
array_after=( two three );
concat=( ${array_before[@]} ${array_after[@]} );
echo ${concat[*]};                          # => zero one two three

results matching ""

    No results matching ""