在 Bash 下,$*
和 $@
都是将所有命令行参数展开,两者在不加双引号的时候,展开结果是一样的,都是
$1 $2 $3 ...
,由于没有双引号的变量在命令行展开发生在命令行解析之前,因此如果某个变量里面含有空格、tab、回车等符号的时候,展开后在命令行解析的时候就会断开被识别成两个参数。
双引号引起来的变量值的代入发生在命令行解析之后,解析完毕之后,命令行已经被拆分成为参数列表,再展开的时候变量的值内部含有的空格就不会再影响到参数的切分了,这是传递内部含有空格的参数的一个非常重要的技巧。对于
"$*"
和
"$@"
,加了双引号的话,两者是有很大区别的。
"$*"
展开的时候,将所有待展开的参数放在一对双引号里面,展开完毕后整体变成一个参数:"$1 $2 $3 ..."
。
而 "$@"
展开的时候,是将每个参数分别用双引号引起来,完毕后原先是几个参数展开后还是那么多个参数:"$1" "$2" "$3" "..."