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

jdg4fx2g  于 2022-11-04  发布在  Unix
关注(0)|答案(8)|浏览(289)

在shell脚本中,美元符号后跟at符号(@)意味着什么?
例如:

umbrella_corp_options $@
20jt8wwn

20jt8wwn1#

$@是传递给脚本的所有参数。
例如,如果调用./someScript.sh foo bar,则$@将等于foo bar
如果您这样做:

./someScript.sh foo bar

然后在someScript.sh引用中:

umbrella_corp_options "$@"

它将传递给umbrella_corp_options,每个参数都用双引号括起来,允许从调用者处获取带有空格的参数并传递它们。

ffvjumwh

ffvjumwh2#

$@$*几乎相同,都表示“所有命令行参数”。它们通常用于简单地将所有参数传递给另一个程序(从而形成另一个程序的 Package 器)。
当你有一个带空格的参数(例如),并把$@放在双引号中时,这两种语法之间的区别就显现出来了:

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
j91ykkif

j91ykkif3#

这些是命令行参数,其中:
$@ =将所有参数存储在字符串列表中
$* =将所有参数存储为单个字符串
$# =存储参数的数量

6ljaweal

6ljaweal4#

使用纯$@在大多数情况下意味着“尽可能地伤害程序员”,因为在大多数情况下,它会导致单词分隔以及参数中的空格和其他字符的问题。
在(猜测的)99%的情况下,需要将其包含在"中:"$@"是可以用来可靠地迭代参数的变量。

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

cidc1ykv5#

含义。

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

*注意:单词拆分。

shell根据IFS环境变量的内容拆分令牌。例如,空格、制表符和换行符。展开"$@"可以提供***所传递参数的原始副本。展开$@则不能。更具体地说,任何包含IFS中的字符的参数都可能会拆分为两个或更多参数,或者被截断。
因此,大多数情况下,您需要使用的是"$@",而不是$@

vlurs2pr

vlurs2pr6#

来自手册:
@
从一个参数开始扩展到位置参数。当扩展出现在双引号内时,每个参数都将扩展为一个单独的单词。也就是说,“$@”等效于“$1”“$2...”。如果双引号扩展出现在一个单词内,则第一个参数的扩展将与原始单词的开头部分联接。并且最后一个参数的扩展与原始单词的最后一部分连接。当没有位置参数时,“$@”和$@扩展为空(即,它们被移除)。

u5rb5r59

u5rb5r597#

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

6qftjkof

6qftjkof8#

它们通常用于将所有参数传递给另一个程序
[root@node1 shell]# ./我的脚本hi 11 33 hi 11 33 [根目录@node1

相关问题