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

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

那么两者有什么不同?

差别是微妙的; "$*"创build一个由$IFSvariables分隔的参数,而"$@"将扩展为单独的参数。 举个例子,考虑一下:

 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

$ *

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

$ @

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

与我的POV的主要区别是"$@"保留了原始的参数数量。 这是唯一的forms。

例如,如果文件my_script包含:

 #!/bin/bash main() { echo 'MAIN sees ' $# ' args' } main $* main $@ main "$*" main "$@" ### end ### 

我像这样运行它:

 my_script 'abc' de 

我会得到这个输出:

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