多年来,我曾多次在shell脚本中使用$*
和$@
之间犹豫不决。在一遍又一遍地阅读了Bash手册页的适用部分后,尝试了$*
和$@
,我或多或少完全无法理解两个变量之间应用的实际差异。你能告诉我吗?
我最近一直在使用$*
,但不要问我原因。我不知道为什么,因为我不知道为什么$@
甚至存在,除了$*
几乎完全是同义词。
有没有实际区别?
(我个人倾向于使用Bash,但对于shell的选择仍然是不可知的。据我所知,我的问题并不是针对Bash的。)
答案 0 :(得分:58)
没有引用,没有区别 - 它们扩展到所有参数,并且它们相应地分开。引用时会出现差异。 "$@"
扩展为正确引用的参数,"$*"
将所有参数扩展为单个参数。以此为例:
#!/bin/bash
function print_args_at {
printf "%s\n" "$@"
}
function print_args_star {
printf "%s\n" "$*"
}
print_args_at "one" "two three" "four"
print_args_star "one" "two three" "four"
然后:
$ ./printf.sh
one
two three
four
one two three four
答案 1 :(得分:6)
考虑:
foo() { mv "$@"; }
bar() { mv "$*"; }
foo a b
bar a b
对foo的调用将尝试mv文件a到b。对bar的调用将失败,因为它只用一个参数调用mv。
答案 2 :(得分:5)
另请注意,当引号中没有其他内容时,"$@"
仅为 。这些是相同的:
set -- a "b c" d
some_func "foo $*"
some_func "foo $@"
在这两种情况下,some_func都会收到一个参数。