Shell语言用例

Bash里面$@和$*的区别

2018-10-13  本文已影响1人  CodingCode

Bash里面$@和$*的区别

$@和 $*通常在bash处理命令行参数的时候使用。

相同点

大部分场景下他们是相同的,可以直接通用,表示命令行的所有参数,实际上是由细微差异的,细节的时候要注意区分。

差异点

可以这么理解:

  1. $@表示的是参数的数组类型
    当有多个参数的时候,每个参数占用一个数组元素。
  2. $*表示的是参数的字符串类型
    当有多个参数的时候,所有参数拼成一个长字符串作为一个参数。

举例

  1. 例子1
$ cat t.sh 
#!/bin/bash
echo "\$@=["$@"]"
echo "\$*=["$*"]"

$ ./t.sh 
$@=[]
$*=[]

$ ./t.sh aa bb
$@=[aa bb]
$*=[aa bb]

两者并无差异。

  1. 例子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

这里我们看到$@和$*在没有双引号括起来的时候行为是一样的,而当使用双引号括起来的时候是不一样的。

  1. 对于$@假定是数组,那么数组为空,就是没有元素

  2. 对于$是字符串,字符串为空时,表示空串,但不为空值,所以在遍历
    $
    的时候能够找到一个元素,尽管这个元素的值是空串。

  3. 例子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。

上一篇 下一篇

猜你喜欢

热点阅读