2

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

#!/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 $*     $@

由于它们相同,这是否意味着$@等于$*?还是我缺少一点?

4

3 回答 3

6

来自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
于 2013-09-27T14:21:53.863 回答
4
$ 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[*]}
于 2013-09-27T14:29:10.590 回答
3

http://linuxsig.org/files/bash_scripting.html

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

所以

$1 $2 ...

"$@" 存储在命令行中输入的所有参数,单独引用

所以

"$1" "$2" ...
于 2013-09-27T14:22:10.660 回答