在我看来,它们都存储了所有的命令行参数。
那么这两者之间有区别吗?
区别很微妙; "$*"创建一个由 $IFS变量分隔的参数,而 "$@"将扩展为单独的参数。例如:
"$*"
$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,则不使用中间的分隔符连接参数。
"$1c$2c..."
$@
展开到位置参数,从1开始。当扩展发生在双引号中时,每个参数展开为一个单独的单词。也就是说,"$@"等价于 "$1" "$2" ....如果在一个单词中发生双引号展开,则第一个参数的展开与原单词的开始部分连接,而最后一个参数的展开与原单词的最后一部分连接。当没有位置参数时,"$@"和 $@扩展为零(即,它们被删除)。
"$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