Sử dụng "$@"
sẽ chuyển tất cả các đối số đến cd
nơi như $1
sẽ chỉ vượt qua đối số đầu tiên.
Trong ví dụ của bạn
$ . cdtest.sh "r st"
luôn luôn hoạt động khi bạn chỉ vượt qua trong một đối số, nhưng nếu bạn đã vượt qua trong một cờ cũng như
$ . cdtest.sh -L "r st"
Sau đó, "$@"
sẽ chỉ thực hiện chính xác nơi "$1"
sẽ mở rộng để cd -L
mất hoàn toàn thư mục.
Tuy nhiên
$ . cdtest.sh r st
Thất bại trong cả hai trường hợp khi bạn chuyển hai tham số cho cd r
và st
đó không phải là cách hợp lệ để thực thi cd. Các tham số được phân tách bằng khoảng trắng phải được trích dẫn (như trong ví dụ đầu tiên của bạn) hoặc esc thoát ( r\ st
) để được coi là một đối số.
Tuy nhiên, trong trường hợp của cd, việc truyền cờ và bạn không thể vượt qua trong nhiều thư mục là điều không phổ biến, do đó bạn sẽ không thấy sự khác biệt trong việc sử dụng trong thế giới thực của một trong hai "$1"
hoặc "$@"
cho cd. Nhưng đối với các lệnh khác, bạn sẽ nhận thấy một sự khác biệt vì vậy tốt nhất là luôn luôn sử dụng "$@"
khi bạn muốn tạo một hàm bao bọc hoặc tập lệnh như thế này.
cd "$*"
cũng sẽ không hoạt động chính xác với hơn 1 arg.