Bash里面$@和$*的区别
2018-10-13 本文已影响1人
CodingCode
Bash里面$@和$*的区别
$@和 $*通常在bash处理命令行参数的时候使用。
相同点
大部分场景下他们是相同的,可以直接通用,表示命令行的所有参数,实际上是由细微差异的,细节的时候要注意区分。
差异点
可以这么理解:
- $@表示的是参数的数组类型
当有多个参数的时候,每个参数占用一个数组元素。 - $*表示的是参数的字符串类型
当有多个参数的时候,所有参数拼成一个长字符串作为一个参数。
举例
- 例子1
$ cat t.sh
#!/bin/bash
echo "\$@=["$@"]"
echo "\$*=["$*"]"
$ ./t.sh
$@=[]
$*=[]
$ ./t.sh aa bb
$@=[aa bb]
$*=[aa bb]
两者并无差异。
- 例子2
$ cat t.sh
#!/bin/bash
echo "----0"
for i in $@; do echo "\$i=["$i"]"; done
echo "----1"
for i in $*; do echo "\$i=["$i"]"; done
echo "----2"
for i in "$@"; do echo "\$i=["$i"]"; done
echo "----3"
for i in "$*"; do echo "\$i=["$i"]"; done
echo "----4"
$ ./t.sh
----0
----1
----2
----3
$i=[]
----4
$ ./t.sh aaa bbb
----0
$i=[aaa]
$i=[bbb]
----1
$i=[aaa]
$i=[bbb]
----2
$i=[aaa]
$i=[bbb]
----3
$i=[aaa bbb]
----4
这里我们看到$@和$*在没有双引号括起来的时候行为是一样的,而当使用双引号括起来的时候是不一样的。
-
对于$@假定是数组,那么数组为空,就是没有元素
-
对于$是字符串,字符串为空时,表示空串,但不为空值,所以在遍历
$的时候能够找到一个元素,尽管这个元素的值是空串。 -
例子3
这个例子调用子程序,并且把$@和 $*作为参数传递给子程序。
$ cat t.sh
#!/bin/bash
./tt.sh $@
./tt.sh $*
./tt.sh "$@"
./tt.sh "$*"
$ cat tt.sh
#!/bin/bash
echo "size="$# "\$@=["$@"]" "\$*=["$*"]"
$ ./t.sh
size=0 $@=[] $*=[]
size=0 $@=[] $*=[]
size=0 $@=[] $*=[]
size=1 $@=[] $*=[]
$ ./t.sh aa bb
size=2 $@=[aa bb] $*=[aa bb]
size=2 $@=[aa bb] $*=[aa bb]
size=2 $@=[aa bb] $*=[aa bb]
size=1 $@=[aa bb] $*=[aa bb]
例子3也说明"$*"是一个字符串,当没有参数是,字符串为空,表示字符串的值为空串,并不是参数整个为空;这类似高级语言里面的null和"",如果是字符串那么他不会为null,只会是"",所以$#计算出来的值为1。