$ @在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”….如果双引号扩展出现在一个单词内,则第一个参数的扩展与原始单词的开始部分相连,最后一个参数的扩展与原始单词的最后部分连接起来。 当没有位置参数时,“$ @”和$ @展开为空(即,它们被移除)。