访问bash命令行参数$ @ vs $ *

在许多SO问题和bash教程中,我看到可以通过两种方式访问​​bash脚本中的命令行参数:

$ ~ >cat testargs.sh #!/bin/bash echo "you passed me" $* echo "you passed me" $@ 

其结果是:

 $ ~> bash testargs.sh arg1 arg2 you passed me arg1 arg2 you passed me arg1 arg2 

$*$@什么区别?
何时应使用前者,何时使用后者?

引用特殊参数时会出现差异。 让我来说明一下不同之处:

 $ set -- "arg 1" "arg 2" "arg 3" $ for word in $*; do echo "$word"; done arg 1 arg 2 arg 3 $ for word in $@; do echo "$word"; done arg 1 arg 2 arg 3 $ for word in "$*"; do echo "$word"; done arg 1 arg 2 arg 3 $ for word in "$@"; do echo "$word"; done arg 1 arg 2 arg 3 

引用重要性的另一个例子是:注意“arg”和数字之间有2个空格,但是如果我不引用$ word:

 $ for word in "$@"; do echo $word; done arg 1 arg 2 arg 3 

在bash中, "$@"是迭代的“默认”列表:

 $ for word; do echo "$word"; done arg 1 arg 2 arg 3 

Bash Hackers Wiki的一个很好的方便的概述表:

$ *与$ @表

如果参数要存储在一个脚本variables和参数预期包含空格,我衷心推荐使用"$*"技巧与内部字段分隔符$IFS设置为选项卡 。

$ *

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

$ @

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

来源: Bash男人

$ @和$ *是一样的,但是每个参数都是一个带引号的string,也就是说,参数是完整的传递的,没有解释或者扩展。 这意味着,除其他外,参数列表中的每个参数都被视为一个单独的单词。

当然,应该引用“$ @”。

http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST