在 shell 脚本中,一个美元符号后面跟着一个 at 符号 (@
) 是什么意思?
例如:
umbrella_corp_options $@
$@
是传递给脚本的所有参数。
例如,如果你调用 ./someScript.sh foo bar
,那么 $@
将等于 foo bar
。
如果你执行:
./someScript.sh foo bar
然后在 someScript.sh
文件内引用:
umbrella_corp_options "$@"
这将被传递给umbrella_corp_options
,每个单独的参数都用双引号括起来,允许从调用者处获取带有空格参数并将其传递。
$@
与$*
几乎相同,都表示“所有命令行参数”。它们经常用于通过简单地将所有参数传递给另一个程序(从而形成该其他程序的包装器)。
当您遇到带有空格的参数(例如),并将$@
放在双引号中时,两种语法之间的区别就会显现出来:
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
$@
是没有用的。如果它出现了,通常只是一个错误,有引号的版本才是预期的。没有引号时,它与没有引号的 $*
相同(这是一致的,但是,正如我所说,无用的)。 - Alfe以下是命令行参数的解释:
$@
= 将所有参数存储在字符串列表中
$*
= 将所有参数存储为单个字符串
$#
= 存储参数数量
"$@"
实际上不是字符串列表,而是参数列表。 - Luis Lavaire.在大多数情况下,纯粹的$@
意味着“尽可能地伤害程序员”,因为在大多数情况下,它会导致单词分隔和参数中的空格和其他字符问题。
在(猜测)99%的情况下,需要将其用引号括起来:"$@"
可以可靠地迭代参数。
for a in "$@"; do something_with "$a"; done
for a in start_token "$@" end_token; do something_with "$a"; done
就好了 :-) - glglgl简而言之,$@
扩展为从调用者传递给一个函数或脚本的参数。它的含义是上下文相关的:在函数内部,它扩展为传递给该函数的参数。如果在脚本中使用(不在函数内),它会扩展为传递给该脚本的参数。
$ cat my-script
#! /bin/sh
echo "$@"
$ ./my-script "Hi!"
Hi!
$ put () { echo "$@"; }
$ put "Hi!"
Hi!
* 注意:单词分割。
Shell根据IFS
环境变量的内容来分割标记。它的默认值是 \t\n
,也就是空格、制表符和换行符。扩展"$@"
可以给你一个传递参数的完美副本。但是扩展$@
不一定如此。更具体地说,任何包含在IFS
中出现的字符的参数都可能被分成两个或更多个参数,或者被截断。
因此,大多数情况下你需要使用的是"$@"
,而不是$@
。
@
扩展为从1开始的位置参数。当在双引号内扩展时,每个参数会扩展为一个单独的单词。也就是说,“$@”等同于“$1”“$2”...。如果双引号扩展出现在一个单词内部,则第一个参数的扩展与原始单词的起始部分连接,最后一个参数的扩展则与原始单词的最后一部分连接。当没有位置参数时,“$@”和“$*”不会扩展任何内容(即它们被删除)。
$@
基本上用于引用 shell 脚本的所有命令行参数。
$1,$2,$3
分别引用第一个、第二个和第三个命令行参数。
它们通常用于将所有参数简单地传递给另一个程序
[root@node1 shell]# ./my-script hi 11 33 hi 11 33 [root@node1
someScript.sh foo bar "boo far"
,那么 $@ 会包含什么? - trusktr$@
不一定来自于传递给脚本的参数...例如:set a b "x y"; printf '(%s)' "$@"
的输出结果为(a)(b)(x y)
。 - Peter.O$@
和$*
之间的主要区别。 - donleyp$0
。$@
是从$1
开始的所有参数。 - Roland