$@
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 bash
hướ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 bash
hướ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 text
nhậ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 zenity
và 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.