参见英文答案 >
What is the difference between $@ and $* in shell scripts?3答案在我看来,他们都存储所有的命令行参数。
那么两者之间有区别吗?
区别是微妙的; “$ *”创建一个由$ IFS变量分隔的参数,而“$ @”将扩展为单独的参数。例如,考虑:
原文链接:https://www.f2er.com/bash/389366.htmlfor 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特殊变量的第一个字符分隔。也就是说,“$ *”等价于“$ 1c $ 2c …”,其中c是IFS变量值的第一个字符。如果未设置IFS,则参数由空格分隔。如果IFS为null,则连接参数时不插入分隔符。
$ @
扩展为位置参数,从一个开始。当扩展出现在双引号内时,每个参数扩展为单独的单词。也就是说,“$ @”等价于“$ 1”“$ 2”….如果在单词中出现双引号扩展,则将第一个参数的扩展与原始单词的开头部分合并,最后一个参数的扩展与原始单词的最后一部分连接。当没有位置参数时,“$ @”和$ @展开为无(即,它们被删除)。