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

时间:2012-04-03 13:28:31

标签: linux bash shell unix sh

在shell脚本中,符号(@)后跟一个美元符号是什么意思?

例如:

umbrella_corp_options $@

6 个答案:

答案 0 :(得分:189)

$@所有传递给脚本的参数。

例如,如果您致电./someScript.sh foo bar,则$@将等于foo bar

如果你这样做:

./someScript.sh foo bar

然后在someScript.sh内部参考:

umbrella_corp_options "$@"

这将传递给umbrella_corp_options,每个参数都用双引号括起来,允许从调用者那里获取带空格的参数并传递它们。

答案 1 :(得分:85)

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

当你有一个包含空格的参数(例如)并将$@放在双引号中时,会显示两种语法之间的差异:

wrappedProgram "$@"
# ^^^ this is correct and will hand over all arguments in the way
#     we received them, i. e. 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"
                             ^^^^ These spaces are part of the first
                                  argument and are not changed.
$*:   wrappedProgram one two three four five six seven

答案 2 :(得分:28)

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

$@ =将所有参数存储在字符串列表中 $* =将所有参数存储为单个字符串
$# =存储参数数量

答案 3 :(得分:9)

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

在(猜测)99%的案例中,需要将其括在"中:"$@"可用于可靠地迭代参数。

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

答案 4 :(得分:6)

From the manual:

  

@

     

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

答案 5 :(得分:1)

含义。

简而言之, $@扩展为从调用方传递给函数或脚本的位置参数。 。其含义是与上下文相关的:在函数内部,它扩展为传递给该函数的参数。如果在脚本中使用(不在函数范围内),它将扩展为传递给该脚本的参数。

$ cat my-sh
#! /bin/sh
echo "$@"

$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!

分词。

现在,分词是了解$@在shell中的行为时至关重要的另一个主题。 Shell根据IFS变量的内容分割标记。其默认值为\t\n;即空格,制表符和换行符。

扩展"$@"可为您传递的参数提供 原始副本 。但是,扩展$@并非总是如此。更具体地说,如果参数包含IFS中的字符,则它们将拆分。​​


大多数情况下,您要使用的是"$@",而不是$@