$ *和$ @之间的区别

时间:2012-03-28 21:03:42

标签: bash shell

  

可能重复:
  What the difference between “$@” and “$*” in bash?

多年来,我曾多次在shell脚本中使用$*$@之间犹豫不决。在一遍又一遍地阅读了Bash手册页的适用部分后,尝试了$*$@,我或多或少完全无法理解两个变量之间应用的实际差异。你能告诉我吗?

我最近一直在使用$*,但不要问我原因。我不知道为什么,因为我不知道为什么$@甚至存在,除了$*几乎完全是同义词。

有没有实际区别?

(我个人倾向于使用Bash,但对于shell的选择仍然是不可知的。据我所知,我的问题并不是针对Bash的。)

3 个答案:

答案 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都会收到一个参数。