Bash array with spaces in elements Bash array with spaces in elements bash bash

Bash array with spaces in elements


I think the issue might be partly with how you're accessing the elements. If I do a simple for elem in $FILES, I experience the same issue as you. However, if I access the array through its indices, like so, it works if I add the elements either numerically or with escapes:

for ((i = 0; i < ${#FILES[@]}; i++))do    echo "${FILES[$i]}"done

Any of these declarations of $FILES should work:

FILES=(2011-09-04\ 21.43.02.jpg2011-09-05\ 10.23.14.jpg2011-09-09\ 12.31.16.jpg2011-09-11\ 08.43.12.jpg)

or

FILES=("2011-09-04 21.43.02.jpg""2011-09-05 10.23.14.jpg""2011-09-09 12.31.16.jpg""2011-09-11 08.43.12.jpg")

or

FILES[0]="2011-09-04 21.43.02.jpg"FILES[1]="2011-09-05 10.23.14.jpg"FILES[2]="2011-09-09 12.31.16.jpg"FILES[3]="2011-09-11 08.43.12.jpg"


There must be something wrong with the way you access the array's items. Here's how it's done:

for elem in "${files[@]}"...

From the bash manpage:

Any element of an array may be referenced using ${name[subscript]}. ... 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.

Of course, you should also use double quotes when accessing a single member

cp "${files[0]}" /tmp


You need to use IFS to stop space as element delimiter.

FILES=("2011-09-04 21.43.02.jpg"       "2011-09-05 10.23.14.jpg"       "2011-09-09 12.31.16.jpg"       "2011-09-11 08.43.12.jpg")IFS=""for jpg in ${FILES[*]}do    echo "${jpg}"done

If you want to separate on basis of . then just do IFS="."Hope it helps you:)