O uso "$@"passará todos os argumentos para cdonde como $1passará apenas o primeiro argumento.
Nos seus exemplos
$ . cdtest.sh "r st"
sempre funciona como você passa apenas em um argumento, mas se você passar uma bandeira também, como
$ . cdtest.sh -L "r st"
Só "$@"será executado corretamente onde "$1"será expandido, cd -Lperdendo o diretório completamente.
Contudo
$ . cdtest.sh r st
Falha nos dois casos, pois você está passando dois parâmetros para o cd re stnão é uma maneira válida de executar o cd. Os parâmetros são separados por espaços que devem ser citados (como no seu primeiro exemplo) ou escapados ( r\ st) para serem tratados como um argumento.
No caso do cd, no entanto, é muito incomum passar sinalizadores e você não pode passar em vários diretórios; portanto, você não verá a diferença no uso no mundo real de um "$1"ou "$@"de outro. Mas para outros comandos que você vai notar uma diferença, por isso é melhor prática para usar sempre "$@"quando você quer criar uma função wrapper ou script como este.
cd "$*"também não funcionará corretamente com mais de 1 argumento.