Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Copy a Bash array with empty elements

Tags:

arrays

bash

copy

I'm having problems in bash (ver 4.2.25) copying arrays with empty elements. When I make a copy of an array into another variable, it does not copy any empty elements along with it.

#!/bin/bash

array=( 'one' '' 'three' )
copy=( ${array[*]} )

IFS=$'\n'

echo "--- array (${#array[*]}) ---"
echo "${array[*]}"

echo
echo "--- copy (${#copy[*]}) ---"
echo "${copy[*]}"

When I do this, here is the output:

--- array (3) ---
one

three

--- copy (2) ---
one
three

The original array has all three elements including the empty element, but the copy does not. What am I doing wrong here?

like image 917
Benjamin Leinweber Avatar asked Jul 18 '13 22:07

Benjamin Leinweber


1 Answers

You have a quoting problem and you should be using @, not *. Use:

copy=( "${array[@]}" )

From the bash(1) man page:

Any element of an array may be referenced using ${name[subscript]}. The braces are required to avoid conflicts with pathname expansion. If subscript is @ or *, the word expands to all members of name. These subscripts differ only when the word appears within double quotes. If the word is double-quoted, ${name[*]} expands to a single word with the value of each array member separated by the first character of the IFS special variable, and ${name[@]} expands each element of name to a separate word.

Example output after that change:

--- array (3) ---
one

three

--- copy (3) ---
one

three
like image 146
Carl Norum Avatar answered Oct 01 '22 14:10

Carl Norum