Використання "$@"
передасть усі аргументи туди, 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 арг.