$ @在shell脚本中意味着什么?

在shell脚本中,后面跟着@符号( @ )是什么意思?

例如:

 umbrella_corp_options $@ 

$ @是传递给脚本的所有参数。 例如,如果您调用./someScript.sh foo bar那么$@将等于foo bar

如果你这样做:

 ./someScript.sh foo bar 

然后在someScript.sh参考里面:

 umbrella_corp_options "$@" 

这将被传递给umbrella_corp_options ,每个单独的参数用双引号括起来,允许来自调用者的空白parameter passing给它们。

$@$*几乎相同,都是“所有命令行参数”。 它们通常用于简单地将所有parameter passing给另一个程序(从而形成另一个程序的包装)。

两个语法之间的区别显示出来,当你有一个空格的参数(例如),并把$@放在双引号中:

 wrappedProgram "$@" # ^^^ this is correct and will hand over all arguments in the way # we received them, ie as several arguments, each of them # containing all the spaces and other uglinesses they have. wrappedProgram "$*" # ^^^ this will hand over exactly one argument, containing all # original arguments, separated by single spaces. wrappedProgram $* # ^^^ this will join all arguments by single spaces as well and # will then split the string as the shell does on the command # line, thus it will split an argument containing spaces into # several arguments. 

例如:呼叫

 wrapper "one two three" four five "six seven" 

将导致:

 "$@": wrappedProgram "one two three" four five "six seven" "$*": wrappedProgram "one two three four five six seven" $*: wrappedProgram one two three four five six seven 

这些是命令行参数,其中:

$@ =将所有参数存储在一个string列表中
$* =将所有参数存储为单个string
$# =存储参数的数量

在大多数情况下,使用纯粹的$@意味着“尽可能地伤害程序员”,因为在大多数情况下,它会导致字词分离和空格以及参数中的其他字符的问题。

在所有情况中(猜测)有99%的情况下,需要把它括在""$@"中,可以用来可靠地迭代参数。

 for a in "$@"; do something_with "$a"; done 

从手册:

@

从一个开始扩展到位置参数。 当扩展出现在双引号内时,每个参数将扩展为一个单独的单词。 也就是说,“$ @”相当于“$ 1”“$ 2”….如果双引号扩展出现在一个单词内,则第一个参数的扩展与原始单词的开始部分相连,最后一个参数的扩展与原始单词的最后部分连接起来。 当没有位置参数时,“$ @”和$ @展开为空(即,它们被移除)。