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:)