@
在shell脚本中,美元符号后跟at符号()是什么意思?
例如:
umbrella_corp_options $@
@
在shell脚本中,美元符号后跟at符号()是什么意思?
例如:
umbrella_corp_options $@
Answers:
$@
是传递给脚本的所有参数。
举例来说,如果你打电话./someScript.sh foo bar
,然后$@
将等于foo bar
。
如果您这样做:
./someScript.sh foo bar
然后里面someScript.sh
引用:
umbrella_corp_options "$@"
该参数将传递给umbrella_corp_options
每个参数,并用双引号引起来,从而允许调用者从空格中获取参数并将其传递。
someScript.sh foo bar "boo far"
?
$@
但不一定来自传递给脚本的参数。set a b "x y"; printf '(%s)' "$@"
输出(a)(b)(x y)
$@
和之间的主要区别$*
$@
与几乎相同$*
,均表示“所有命令行参数”。它们通常用于简单地将所有参数传递给另一个程序(从而形成对该另一个程序的包装)。
当您的参数中带有空格(例如)并$@
用双引号引起来时,就会显示出两种语法之间的差异:
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
wrappedProgram "$*"
-> separated by single spaces.
但在您的第二个示例中,它们之间没有空格。
这些是命令行参数,其中:
$@
=将所有参数存储在字符串列表中
$*
=将所有参数存储为单个字符串
$#
=存储参数数量
$@
在大多数情况下,使用纯手段“会尽最大努力伤害程序员”,因为在大多数情况下,这会导致单词分隔以及参数中的空格和其他字符的问题。
在(被猜测的)所有情况的99%中,需要将其括在"
:"$@"
中,该变量可用于可靠地遍历参数。
for a in "$@"; do something_with "$a"; done
for a in start_token "$@" end_token; do something_with "$a"; done
:-)
@
从一个开始扩展到位置参数。当在双引号内进行扩展时,每个参数都会扩展为单独的单词。也就是说,“ $ @”等效于“ $ 1”,“ $ 2”...。如果在单词中出现双引号扩展,则第一个参数的扩展与原始单词的开头部分连接在一起,并且最后一个参数的扩展与原始单词的最后一部分结合在一起。当没有位置参数时,“ $ @”和$ @扩展为空(即,它们被删除)。
简而言之,$@
扩展为从调用方传递给函数或脚本的位置参数。它的含义取决于上下文:在函数内部,它扩展为传递给该函数的参数。如果在脚本中使用(不在函数的作用域内),它将扩展为传递给该脚本的参数。
$ cat my-sh
#! /bin/sh
echo "$@"
$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!
现在,了解$@
外壳中的行为时另一个至关重要的主题是单词拆分。Shell根据IFS
变量的内容分割标记。默认值为\t\n
; 即空格,制表符和换行符。
扩展"$@"
为您提供了所传递参数的原始副本。但是,扩展$@
并非总是如此。更具体地说,如果参数包含的字符IFS
,则它们将拆分。
大多数时候,你会想什么用途"$@"
,不是$@
。