Usar "$@" passará todos os argumentos para cd , em que $1 passará apenas o primeiro argumento.
Nos seus exemplos
$ . cdtest.sh "r st"
funciona sempre que você só passa em um argumento, mas se você fosse passar uma bandeira também, como
$ . cdtest.sh -L "r st"
Em seguida, somente "$@" será executado corretamente, onde "$1" será expandido para cd -L , perdendo completamente o diretório.
No entanto
$ . cdtest.sh r st
Falha nos dois casos quando você passa dois parâmetros para cd, r e st , o que não é uma maneira válida de executar o cd. Os parâmetros são separados por espaços que devem ser citados (como em seu primeiro exemplo) ou com escape ( r\ st ) para serem tratados como um argumento.
No caso de cd, no entanto, é muito incomum passar flags e você não pode passar em vários diretórios, assim você não verá a diferença no uso real de "$1" ou "$@" para cd. Mas para outros comandos você irá notar uma diferença, portanto, é uma prática recomendada usar sempre "$@" quando você quiser criar uma função de wrapper ou um script como este.