Search code examples
arraysbashshellconcatenation

How to concatenate arrays in bash?


How can I read lines from the standard input into an array and then concatenate the array with itself?

My code is:

countries=()
while read -r country; do
    countries+=( "$country" )
done
countries=countries+countries+countries # this is the wrong way, i want to know the right way to do it
echo "${countries[@]}"

Note that, I can print it thrice like the code below, but it is not my motto. I have to concatenate them in the array.

countries=()
while read -r country; do
    countries+=( "$country" )
done
echo "${countries[@]} ${countries[@]} ${countries[@]}"

Solution

  • First, to read your list into an array, one entry per line:

    readarray -t countries
    

    ...or, with older versions of bash:

    # same, but compatible with bash 3.x; || is to avoid non-zero exit status.
    IFS=$'\n' read -r -d '' countries || (( ${#countries[@]} ))
    

    Second, to duplicate the entries, either expand the array to itself three times:

    countries=( "${countries[@]}" "${countries[@]}" "${countries[@]}" )
    

    ...or use the modern syntax for performing an append:

    countries+=( "${countries[@]}" "${countries[@]}" )