<分区>
在我看来,它们都存储了所有的命令行参数。
那么两者有区别吗?
<分区>
在我看来,它们都存储了所有的命令行参数。
那么两者有区别吗?
最佳答案
区别很微妙; "$*"
创建一个由 $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
$*
扩展到位置参数,从一个开始。当扩展发生在双引号内时,它扩展为单个单词,每个参数的值由 IFS 特殊变量的第一个字符分隔。也就是说,"$*"
等同于 "$1c$2c..."
,其中 c 是 IFS 变量值的第一个字符。如果未设置 IFS,则参数以空格分隔。如果 IFS 为空,参数将在没有中间分隔符的情况下连接。
$@
扩展到位置参数,从一个开始。当扩展发生在双引号内时,每个参数都会扩展为一个单独的词。也就是说,"$@"
等同于 "$1""$2"....
如果双引号扩展出现在一个单词中,则第一个扩展参数与原词的开头部分相连,最后一个参数的扩展与原词的最后部分相连。当没有位置参数时,"$@"
和 $@
展开为空(即,它们被删除)。
关于bash - Bash 中的 "$@"和 "$*"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3008695/