Bash里面$@和$*的區(qū)別
$@和 $*通常在bash處理命令行參數(shù)的時(shí)候使用叮称。
相同點(diǎn)
大部分場(chǎng)景下他們是相同的种玛,可以直接通用,表示命令行的所有參數(shù)瓤檐,實(shí)際上是由細(xì)微差異的赂韵,細(xì)節(jié)的時(shí)候要注意區(qū)分。
差異點(diǎn)
可以這么理解:
- $@表示的是參數(shù)的數(shù)組類型
當(dāng)有多個(gè)參數(shù)的時(shí)候挠蛉,每個(gè)參數(shù)占用一個(gè)數(shù)組元素祭示。 - $*表示的是參數(shù)的字符串類型
當(dāng)有多個(gè)參數(shù)的時(shí)候,所有參數(shù)拼成一個(gè)長(zhǎng)字符串作為一個(gè)參數(shù)谴古。
舉例
- 例子1
$ cat t.sh
#!/bin/bash
echo "\$@=["$@"]"
echo "\$*=["$*"]"
$ ./t.sh
$@=[]
$*=[]
$ ./t.sh aa bb
$@=[aa bb]
$*=[aa bb]
兩者并無(wú)差異质涛。
- 例子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
這里我們看到$@和$*在沒有雙引號(hào)括起來的時(shí)候行為是一樣的,而當(dāng)使用雙引號(hào)括起來的時(shí)候是不一樣的掰担。
對(duì)于$@假定是數(shù)組汇陆,那么數(shù)組為空,就是沒有元素
對(duì)于$是字符串恩敌,字符串為空時(shí)瞬测,表示空串,但不為空值纠炮,所以在遍歷
$的時(shí)候能夠找到一個(gè)元素月趟,盡管這個(gè)元素的值是空串。例子3
這個(gè)例子調(diào)用子程序恢口,并且把$@和 $*作為參數(shù)傳遞給子程序孝宗。
$ 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也說明"$*"是一個(gè)字符串,當(dāng)沒有參數(shù)是耕肩,字符串為空因妇,表示字符串的值為空串问潭,并不是參數(shù)整個(gè)為空;這類似高級(jí)語(yǔ)言里面的null和""婚被,如果是字符串那么他不會(huì)為null狡忙,只會(huì)是"",所以$#計(jì)算出來的值為1址芯。