Bash $@和$*

Bash $@和$*,bash,parameters,command-line-interface,Bash,Parameters,Command Line Interface,我已经编写了一个简单的脚本,它接受了任意数量的参数来演示$@和$*之间的区别: #!/bin/bash echo "double quoted $* $@" echo 'single quoted $* $@' 在CLI上,我这样做了 $./stuff.sh a b c d e f dfs 这是打印出来的 double quoted a b c d

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

#!/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 $*     $@
由于它们是相同的,这是否意味着
$@
等于
$*
?还是我遗漏了一点?

来自

*

展开到位置参数,从一开始。当 展开发生在双引号内,它展开为单个单词 每个参数的值由 IFS特殊变量。也就是说,“$*”相当于“$1c$2c…”, 其中c是IFS变量值的第一个字符。如果 如果未设置,则参数用空格分隔。如果IFS为空, 这些参数是在不插入分隔符的情况下合并的

@

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

最好举个例子:

$ 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
$d=(a b c)
“${d[*]}”中i的$;不要重复$i;完成来自:

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

所以

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

所以


请看,,。正确的信息,但引用回一个非常糟糕的来源。(在《bash》中,一个经常让人烦恼的事情就是帮助人们忘记ABS教他们写的bug)。确切地说,我只是想找一个更好的参考书。更新:)
$1$2…
仅在默认的
IFS
值下为真。如果您设置了
IFS=:
,那么它将变成
$1:$2:…
f/e。您能提供一个
$@
(不带双引号)的示例吗?你的例子帮助我快速理解它们的区别。如果不加引号使用,
$@
与不加引号的
$*
完全相同。我很乐意为这一点添加一个例子。
$1 $2 ...
"$1" "$2" ...
$ 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 $*.
jars=( *.jar )
IFS=:
export CLASSPATH=${jars[*]}