shell脚本中$ @和$ *有什么区别?

在我的script.sh

 aa=$@ bb=$* echo $aa echo $bb 

运行时:

  source script.sh abcdefg 

我得到:

 abcdefg abcdefg 

$@$*什么区别?

$*$@之间没有区别,但是"$@""$*"之间有区别。

 $ cat 1.sh mkdir "$*" $ cat 2.sh mkdir "$@" $ sh 1.sh a "bc" d $ ls -l total 12 -rw-r--r-- 1 igor igor 11 mar 24 10:20 1.sh -rw-r--r-- 1 igor igor 11 mar 24 10:20 2.sh drwxr-xr-x 2 igor igor 4096 mar 24 10:21 abcd 

我们给了脚本( abcd )三个参数,但是在“$ *”中它们全部被合并为一个参数abcd

 $ sh 2.sh a "bc" d $ ls -l total 24 -rw-r--r-- 1 igor igor 11 mar 24 10:20 1.sh -rw-r--r-- 1 igor igor 11 mar 24 10:20 2.sh drwxr-xr-x 2 igor igor 4096 mar 24 10:21 a drwxr-xr-x 2 igor igor 4096 mar 24 10:21 abcd drwxr-xr-x 2 igor igor 4096 mar 24 10:21 bc drwxr-xr-x 2 igor igor 4096 mar 24 10:21 d 

你可以在这里看到, "$*"意味着总是一个单一的参数, "$@"包含尽可能多的参数,如脚本。 “$ @”是一个特殊的标记,意思是“用引号括住每个单独的参数”。 因此a "bc" d变成(或者说停留) "a" "bc" "d"而不是"abcd""$*" )或"a" "b" "c" "d"$@$* )。

另外,我会推荐这个主题的美丽阅读:

http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST