Splitting input into an array

readarray

readarray makes it really easy to split input into an array based on new lines. Say we have this file as input:

123
456
789

Then we can split like so:

readarray -t name_for_array < ./input.text

# Print all elements
echo "${name_for_array[@]}"

# Print element by index

echo "${name_for_array[1]}"
456

If we want to read a string directly:

readarray -t new_name_for_array <<< "here
is
some
text"

echo "${new_name_for_array[1]}"
is

The -t flag removes the trailing newline

See more: https://linuxhint.com/split-string-array-bash/

read

For delimiters other than a space we have to use read, combined with IFS the Internal Field Separator.

For example, to split by comma:

# comma-input.txt
something,something else,something more
IFS=',' read -a arr < ./comma_inputs.txt

We use the -a flag to signal that we want each item read returned as an element in an array

mapfile

We can use mapfile to read the lines of a input file in set segments.

For the following file:

line one
line two
line three
line four

We could generate the following output:

-----SNIP-----
line one
line two
-----SNIP-----
line three
line four

With:

while mapfile -t -n 2 ary && ((${#ary[@]})); do
  printf '%s\n' "${ary[@]}"
  printf -- '--- SNIP ---\n'
 done < $testInput

So, while there are input lines, map each line into an array and return it in groups of 2.