当前位置: 首页 > 知识库问答 >
问题:

$@和$* [duplicate]之间的差异

蒙化
2023-03-14

我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别:

#!/bin/bash                                                                
echo "double quoted $*     $@"
echo 'single quoted $*     $@'

在我做的 CLI 上

$./stuff.sh a b c d e f dfs 

这就是打印出来的

double quoted a b c d e f dfs     a b c d e f dfs
single quoted $*     $@

因为它们是相同的,这是否意味着$@等于$*?还是我遗漏了一点?

共有3个答案

师成弘
2023-03-14

从…起http://linuxsig.org/files/bash_scripting.html:

$* 存储在命令行上输入的所有参数

所以

$1 $2 ...

“$@”存储在命令行中输入的所有参数,并分别用引号引起来

所以

"$1" "$2" ...
孟跃
2023-03-14
$ set -- "hello world" foo bar
$ printf '<%s> ' "$@"; echo
<hello world> <foo> <bar>     # "$@" keeps original separation
$ printf '<%s> ' "$*"; echo
<hello world foo bar>         # "$*" combines everything into one string
$ printf '<%s> ' $*; echo
<hello> <world> <foo> <bar>   # $* (no quotes) loses delimitation entirely.
$ printf '<%s> ' $@; echo
<hello> <world> <foo> <bar>   # unquoted, $@ is identical to unquoted $*.

从技术上讲,$* 不限于空格分隔;它使用 $IFS 的第一个字符。这可为您带来优势:

jars=( *.jar )
IFS=:
export CLASSPATH=${jars[*]}
傅峻
2023-03-14

来自Bash参考手册中的特殊参数

*

展开到位置参数,从一个开始。当扩展出现在双引号内时,它将扩展为一个单词,每个参数的值由IFS特殊变量的第一个字符分隔。也就是说,“$*”相当于“$1c$2c…”,其中c是IFS变量值的第一个字符。如果未设置IFS,则参数用空格分隔。如果IFS为空,则在没有中间分隔符的情况下连接参数

@

展开到位置参数,从一个开始。当扩展发生在双引号内时,每个参数将扩展为一个单独的单词。也就是说,“$@”相当于“$1”“$2”....如果双引号扩展发生在单词内,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后一部分连接。当没有位置参数时,“$@”和$@将扩展到零(即,它们被删除)。

最好举个例子:

$ d=(a b c)
$ for i in "${d[*]}"; do echo $i; done <---- it is a field all together
a b c
$ for i in "${d[@]}"; do echo $i; done <---- each item is a different field
a
b
c
 类似资料:
  • 而且 区别是什么,什么时候用什么?

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 这两者之间有什么区别?什么是和什么是

  • 我正在运行6个java进程,我将-xms和-xmx参数设置为每个进程1 GB,因此总堆分配为6 GB。我有8 GB的物理内存,所以在启动这6个进程之后,“free”命令应该显示6 GB是已用的,剩下2 GB但事实并非如此。相反,“free”显示只使用了1 GB,而7 GB是免费的。我有点困惑,因为我对-xms(A MB)的理解是,一个MBs的内存是由OS分配给JVM,而-xmx(B MBs)意味着

  • 上次,我发现了Java8及以上版本函数式编程的难点,并在Collectors类中发现了一个静态方法。 我们有一个类员工像: 假设我们有一个类的POJO列表,并且我们希望接收一个所有员工姓名的列表。我们有两种方法,比如: 我知道第一种方法在上使用终端操作,而第二种方法在上使用中间操作,但我想知道第一种方法的性能是否比第二种方法差,反之亦然。如果您能解释第一种情况的潜在性能下降,当我们的数据源(emp

  • 我想写一个矩阵逆的单元测试。 在某些地方,我有0.0f,而反向的单元格有-0.0f,它给出了一个错误,这些单元格不相等。 有没有办法忽略这个错误?