在 Bash 中“ $@”和“ $*”有什么区别?

在我看来,它们都存储了所有的命令行参数。

那么这两者之间有区别吗?

36953 次浏览

区别很微妙; "$*"创建一个由 $IFS变量分隔的参数,而 "$@"将扩展为单独的参数。例如:

for i in "$@"; do echo "@ '$i'"; done
for i in "$*"; do echo "* '$i'"; done

当使用多个参数运行时:

./testvar foo bar baz 'long arg'
@ 'foo'
@ 'bar'
@ 'baz'
@ 'long arg'
* 'foo bar baz long arg'

更多细节:

Http://www.gnu.org/software/bash/manual/bashref.html#special-parameters

$*

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

$@

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

钥匙与我的 POV 的不同之处在于 "$@"保留了原始数字 是 只有表格。

例如,如果文件 my _ script 包含:

#!/bin/bash


main()
{
echo 'MAIN sees ' $# ' args'
}


main $*
main $@


main "$*"
main "$@"


### end ###

我是这样运作的:

my_script 'a b c' d e

我将得到这个输出:

MAIN sees  5  args
MAIN sees  5  args
MAIN sees  1  args
MAIN sees  3  args