$@mở rộng thành các từ riêng biệt (trong khi $*mở rộng thành một từ), như được giải thích trong bashhướng dẫn . Như vậy, khi bạn viết
zenity --text="$@"
nó mở rộng đến
zenity --text="$1" "$2" "$3"
Tuy nhiên, bài tập biến shell không trải qua quá trình phân tách từ. Lưu ý rằng chia tách trường / từ được bỏ qua trong danh sách mở rộng cho các bài tập biến trong bashhướng dẫn . Hành vi này phù hợp với thông số POSIX . Vì vậy, khi bạn viết
text="$@"
biến textnhận được tất cả các tham số vị trí dưới dạng một từ, tương đương với nếu bạn đã viết text="$*". Thật vậy, đây là lý do trích dẫn kép thường không cần thiết trong các bài tập biến. Cả hai
text=$@
và
text=$*
là hoàn toàn an toàn.
Vì thế,
text=$@
zenity --option="$text"
mở rộng "$text"thành một từ duy nhất, đó là lý do tại sao điều này hoạt động. Lưu ý rằng đó --option="$@"chỉ là một đối số bình thường cho lệnh zenityvà không phải là phép gán biến shell, đó là lý do tại sao việc chia từ diễn ra ở đây nhưng không phải trong text=$@.
zenity --text="$*"-"$*"mở rộng thành một từ duy nhất.