在shell脚本中$@是什么意思?

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

例如:

umbrella_corp_options $@
295468 次浏览

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

例如,如果调用./someScript.sh foo bar,则$@将等于foo bar

如果你有:

./someScript.sh foo bar

然后在someScript.sh引用中:

umbrella_corp_options "$@"

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

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

在(猜测)99%的情况下,需要将其括在"中:"$@"可用于可靠地遍历参数。

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

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

当你的参数中有空格(例如)并将$@放在双引号中时,这两种语法之间的差异就会显现出来:

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

以下是命令行参数:

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

的意思。

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

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


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

*注意:分词。

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

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

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

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

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