$*和$ @之间的区别

thb*_*thb 29 bash shell

可能重复:
bash中"$ @"和"$*"之间的区别是什么?

多年来,我曾多次在shell脚本的使用$*和犹豫之间犹豫不决$@.已经读了bash的手册页的适用部分,一遍又一遍,已经尝试都$*$@我或多或少完全无法理解两个变量之间的应用程序的实际差别.你能告诉我吗?

$*最近一直在使用,但不要问我为什么.我不知道为什么,因为我不知道为什么$@甚至存在,除了作为一个几乎完全的同义词$*.

有什么实际区别吗?

(我个人倾向于使用Bash,但对shell的选择保持不可知.就我所知,我的问题并不是Bash特有的.)

Fat*_*ror 64

没有引用,没有区别 - 它们扩展到所有参数,并且它们相应地分开.引用时会出现差异."$@"扩展为正确引用的参数,并将"$*"所有参数转换为单个参数.以此为例:

#!/bin/bash

function print_args_at {
    printf "%s\n" "$@"
}

function print_args_star {
    printf "%s\n" "$*"
}

print_args_at "one" "two three" "four"
print_args_star "one" "two three" "four"
Run Code Online (Sandbox Code Playgroud)

然后:

$ ./printf.sh 

one
two three
four

one two three four
Run Code Online (Sandbox Code Playgroud)


Wil*_*ell 7

考虑:

foo() { mv "$@"; } 
bar() { mv "$*"; }
foo a b
bar a b
Run Code Online (Sandbox Code Playgroud)

对foo的调用将尝试mv文件a到b.对bar的调用将失败,因为它只使用一个参数调用mv.

  • 没有引号,$ @和$*是相同的. (3认同)
  • 另外,在一些破碎的shell上,"$ @"`扩展为空参数`""`如果没有位置参数,而不是正确扩展为空.所以必须使用这个技巧:`$ {@ +"$ @"}`(如果`$ @'是非空的,替换``$ @"`别的什么都没有).如果你看到了,你会知道为什么. (2认同)

gle*_*man 6

还要注意,只有在引号中没有其他内容时"$@"才是魔术.这些是相同的:

set -- a "b c" d
some_func "foo $*"  
some_func "foo $@"
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,some_func都会收到一个参数.