Sua abordagem está correta, ${#arr[@]} fornecerá o número de elementos na matriz (neste caso, 3):
$ var_names='test1 tutorial2 test3w'
$ arr=($var_names)
$ echo ${#arr[@]}
3
Você também pode retornar os comprimentos de string dos elementos individuais da matriz usando ${#arr[0]} , ${#arr[1]} e assim por diante:
$ echo "${#arr[0]}"
5
$ echo "${#arr[1]}"
9
$ echo "${#arr[2]}"
6
O motivo pelo qual $arr retorna apenas o primeiro elemento test1 é que é equivalente a ${arr[0]} ; se você quiser retornar toda a matriz, você pode usar ${arr[@]} ou ${arr[*]} :
echo "${arr[@]}"
test1 tutorial2 test3w
Veja a seção Arrays de man bash