为什么 --text="$@" 只传递第一个单词?

为什么 --text="$@" 只传递第一个单词?

当我使用一些参数运行以下脚本时,例如arg1 arg2 arg3

#!/bin/bash
zenity --entry --text="$@"

zenity 使用以下文本创建一个输入对话框:“arg1”,而我期望“arg1 arg2 arg3”

如果我使用像下面的脚本这样的变量,它会显示条目文本的所有参数。

#!/bin/bash
text="$@"
zenity --entry --text="$text"

这些脚本有什么区别?为什么第一个参数只替换$@为第一个参数?

答案1

$@扩展为单独的单词(而$*扩展为单个单词),如中所述bash手动的。因此,当你写

zenity --text="$@"

它扩展到

zenity --text="$1" "$2" "$3"

然而,shell 变量赋值不会进行分词。请注意,在变量分配的扩展列表中省略了字段/单词分割bash手动的。此行为符合POSIX 规范。所以,当你写

text="$@"

该变量text将所有位置参数作为单个单词获取,相当于您编写了text="$*".事实上,这就是变量赋值中通常不需要双引号的原因。两个都

text=$@

text=$*

是完全安全的。

所以,

text=$@
zenity --option="$text"

扩展"$text"为单个单词,这就是它起作用的原因。请注意,--option="$@"仅仅是命令的普通参数zenity,而不是 shell 变量赋值,这就是为什么分词发生在此处而不是在 中text=$@

答案2

$@将每个参数扩展为单独的单词,变成

zenity --entry --text="arg1" "arg2" "arg3" # syntactically wrong for zenity

使用$*相反 将其扩展为单个单词

zenity --entry --text="$*"

这将成为

zenity --entry --text="arg1 arg2 arg3" # syntactically correct for zenity

相关内容