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

例如:

umbrella_corp_options $@

当前回答

它们通常用于简单地将所有参数传递给另一个程序

[root@node1 shell]# ./my-script hi 11 33 嗨11 33 [root@node1

其他回答

$@基本上用于引用shell-script的所有命令行参数。 $1, $2, $3是第一个命令行参数,第二个命令行参数,第三个参数。

它们通常用于简单地将所有参数传递给另一个程序

[root@node1 shell]# ./my-script hi 11 33 嗨11 33 [root@node1

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

例如,如果你调用。/ somcript .sh foo bar,那么$@将等于foo bar。

如果你有:

./someScript.sh foo bar

然后在somscript .sh引用中:

umbrella_corp_options "$@"

这将被传递给伞状的corp_options,每个单独的参数都用双引号括起来,允许从调用者那里获取带有空格的参数并将它们传递出去。

的意思。

简而言之,$@扩展为从调用者传递给函数或脚本的参数。它的含义与上下文相关:在函数内部,它扩展为传递给该函数的参数。如果在脚本中使用(在函数之外),则扩展为传递给该脚本的参数。

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

$ ./my-script "Hi!"
Hi!
$ put () { echo "$@"; }
$ put "Hi!"
Hi!

*注意:分词。

shell根据IFS环境变量的内容拆分令牌。默认值为\t\n;即,空格、制表符和换行符。展开“$@”可以得到传入参数的原始副本。扩展$@可能不会。更具体地说,任何包含IFS中出现的字符的参数都可能分裂为两个或多个参数或被截断。

因此,大多数时候你想要使用的是“$@”,而不是$@。

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

这两种语法之间的差异体现在你有一个带空格的参数(例如),并把$@放在双引号中:

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