$ @和$*之间的区别

cyc*_*115 2 parameters bash command-line-interface

我已经写了一个简单的脚本,需要在任意数量的参数来证明之间的区别$@$*:

#!/bin/bash                                                                
echo "double quoted $*     $@"
echo 'single quoted $*     $@'
Run Code Online (Sandbox Code Playgroud)

我在CLI上做了

$./stuff.sh a b c d e f dfs 
Run Code Online (Sandbox Code Playgroud)

这就是打印出来的东西

double quoted a b c d e f dfs     a b c d e f dfs
single quoted $*     $@
Run Code Online (Sandbox Code Playgroud)

既然它们是相同的那么意味着$@等于$*?还是有一点我错过了?

fed*_*qui 6

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

*

从1开始扩展到位置参数.当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由IFS特殊变量的第一个字符分隔.也就是说,"$*"相当于"$ 1c $ 2c ...",其中c是IFS变量值的第一个字符.如果未设置IFS,则参数由空格分隔.如果IFS为null,则连接参数时不会插入分隔符.

@

从1开始扩展到位置参数.当扩展发生在双引号内时,每个参数都会扩展为单独的单词.也就是说,"$ @"相当于"$ 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
Run Code Online (Sandbox Code Playgroud)