Використання "$@"передасть усі аргументи туди, 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-дисків. Але для інших команд , які ви будете помічати різницю , так що краще практика , щоб завжди використовувати , "$@"коли ви хочете створити функцію - оболонку або сценарій , як це.
cd "$*"також не буде правильно працювати з більш ніж 1 арг.