${#files} é o comprimento do primeiro elemento da matriz, ou seja, o comprimento de 1 red . Qual é cinco.
No manual :
${#name[subscript]} expands to the length of ${name[subscript]}. If subscript is ‘@’ or ‘*’, the expansion is the number of elements in the array. [...]
Referencing an array variable without a subscript is equivalent to referencing with a subscript of 0.
Então, ${#files} = ${#files[0]} . Mas ${#files[@]} ou ${#files[*]} fornecem o número de elementos na matriz.
(Não tem nada a ver com o número de palavras, mas se você expandir ${files[*]} sem aspas, você obterá a palavra usual dividindo todos os valores.)