Você está achatando a entrada em um valor único.
Você deve fazer
list=("${@}")
para manter a matriz e o potencial de espaço em branco nos argumentos.
Se você perder o "
, algo como ./script.sh "a b" 2 3 4
retornará um comprimento de 5, porque o primeiro argumento será dividido. Com "
, obtemos
$ cat x
#!/bin/bash
list=("${@}")
echo array = ${list[*]} and length = ${#list[*]}
$ ./x "a b" 2 3 4
array = a b 2 3 4 and length = 4