Answers:
$@$*如bash手册中所述,扩展为单独的单词(而扩展为单个单词)。因此,当你写
zenity --text="$@"它扩展到
zenity --text="$1" "$2" "$3"但是,shell变量分配不会进行单词拆分。请注意,bash手册中变量分配的扩展列表中省略了字段/单词拆分。此行为与POSIX规范一致。所以,当你写
text="$@"变量text将所有位置参数作为一个单词获取,等同于您编写了text="$*"。确实,这就是在变量分配中经常不需要双引号的原因。都
text=$@和
text=$*非常安全。
所以,
text=$@
zenity --option="$text"
扩展"$text"为一个单词,这就是为什么它起作用的原因。请注意,--option="$@"只是命令的常规参数zenity,而不是shell变量赋值,这就是为什么在此处而不是in中进行单词拆分的原因text=$@。
$@ 将每个参数扩展成单独的单词,成为
zenity --entry --text="arg1" "arg2" "arg3" # syntactically wrong for zenity使用$*,而不是扩大它在一个单一的词
zenity --entry --text="$*"这将成为
zenity --entry --text="arg1 arg2 arg3" # syntactically correct for zenitytext="$@"将其扩展为text="arg1" "arg2" "arg3",这会失败。但是肯定不是这样。
                    "$@" 也确实会进行单词拆分。
                    
zenity --text="$*"-"$*"扩展为单个单词。