Использование "$@"передаст все аргументы туда, cdгде $1будет передаваться только первый аргумент.
В твоих примерах
$ . cdtest.sh "r st"
всегда работает, когда вы передаете только один аргумент, но если вы должны передать флаг, такой как
$ . cdtest.sh -L "r st"
Только "$@"тогда правильно выполнится, где "$1"расширится до cd -Lполной потери каталога.
тем не мение
$ . cdtest.sh r st
Сбой в обоих случаях, так как вы передаете два параметра в cd, rи stэто не является допустимым способом выполнения cd. Параметры разделяются пробелами, которые должны быть заключены в кавычки (как в первом примере) или экранированы ( r\ st), чтобы рассматриваться как один аргумент.
В случае компакт - диска , однако очень редко проходить в флажками , и вы не можете передать в нескольких каталогах , так что вы не будете видеть разницу в реальном мире использование либо "$1"или "$@"для компакт - диска. Но для других команд , которые вы будете замечать разницу , так что лучше практика , чтобы всегда использовать , "$@"когда вы хотите создать функцию - оболочку или сценарий , как это.
cd "$*"также не будет работать правильно с более чем 1 аргументом.