可能重复:
bash中"$ @"和"$*"之间的区别是什么?
多年来,我曾多次在shell脚本的使用$*和犹豫之间犹豫不决$@.已经读了bash的手册页的适用部分,一遍又一遍,已经尝试都$*和$@我或多或少完全无法理解两个变量之间的应用程序的实际差别.你能告诉我吗?
我$*最近一直在使用,但不要问我为什么.我不知道为什么,因为我不知道为什么$@甚至存在,除了作为一个几乎完全的同义词$*.
有什么实际区别吗?
(我个人倾向于使用Bash,但对shell的选择保持不可知.就我所知,我的问题并不是Bash特有的.)
Fat*_*ror 64
没有引用,没有区别 - 它们扩展到所有参数,并且它们相应地分开.引用时会出现差异."$@"扩展为正确引用的参数,并将"$*"所有参数转换为单个参数.以此为例:
#!/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"
Run Code Online (Sandbox Code Playgroud)
然后:
$ ./printf.sh 
one
two three
four
one two three four
Run Code Online (Sandbox Code Playgroud)
        考虑:
foo() { mv "$@"; } 
bar() { mv "$*"; }
foo a b
bar a b
Run Code Online (Sandbox Code Playgroud)
对foo的调用将尝试mv文件a到b.对bar的调用将失败,因为它只使用一个参数调用mv.
还要注意,只有在引号中没有其他内容时"$@"才是魔术.这些是相同的:
set -- a "b c" d
some_func "foo $*"  
some_func "foo $@"
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,some_func都会收到一个参数.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           14184 次  |  
        
|   最近记录:  |