**$* 和 $@** 都是表示所有位置参数的意思,平常用法并没有什么区别,但在for循环的特定情况下有着不一样的效果。
[root@kvm01 scripts]# vim test.sh
#!/bin/bash
echo "=====*====="
for i in $*
do
echo $i
done
echo "=====@====="
for i in $@
do
echo $i
done
[root@kvm01 scripts]# sh for.sh 1 2 3 4 5
=====*=====
1
2
3
4
5
=====@=====
1
2
3
4
5
通过上面例子我们可以看到两者并没有上面区别,但是如果我们想将4和5归为一个参数呢,我们第一时间想到的便是用引号引起来,我们来试试。
[root@kvm01 ]# sh test.sh 1 2 3 "4 5"
=====*=====
1
2
3
4
5
=====@=====
1
2
3
4
5
尝试后,发现加上引号对于参数的判定还是以空格为分隔符,引号并不起作用。
我们将 **$* 和 $@** 引起来,可以发现两者明显区别。因为加了引号,前者将传递过来的所有位置参数整体当成一个参数进行执行;后者则是空格为分隔符,引号内为整体进行位置参数判定,符合我们的期望。
[root@kvm01 ./for.sh]# test for.sh
#!/bin/bash
echo "=====*====="
for i in "$*"
do
echo $i
done
echo "=====@====="
for i in "$@"
do
echo $i
done
[root@kvm01 for]# sh for.sh 1 2 3 "4 5"
=====*=====
1 2 3 4 5
=====@=====
1
2
3
4 5
总结下:
• 当 $* 和 $@ 没有加上引号的时候,一般情况下它们没有什么区别,都会把位置参数当成一个个体。
• 当 $* 被加上引号时,会把所有位置参数识别成一个整体。
• 当 $@ 被加上引号时,会正常识别所有的位置参数,位于引号内的位置参数会被当成一个整体,如位置参数 "4 5" 会识别成一个参数。