Bash中的“$ @”和“$ *”有什么区别?
在我看来,他们都存储所有的命令行参数。
那么两者有什么不同?
差别是微妙的; "$*"
创build一个由$IFS
variables分隔的参数,而"$@"
将扩展为单独的参数。 举个例子,考虑一下:
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