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 zenity
text="$@"
将其扩展为text="arg1" "arg2" "arg3"
,这会失败。但是肯定不是这样。
"$@"
也确实会进行单词拆分。
zenity --text="$*"
-"$*"
扩展为单个单词。