当我使用一些参数运行以下脚本时,例如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