我们都知道,在shell中 $@ 和 $* 都会获取传递给脚本或函数时所有的参数。
但其中有细微区别。
接下来,笔者将用一个shell脚本将其中的区别展现给大家。
[root@master scripts]# cat test.sh
#!/bin/bash
echo '单引号@是:$@'
echo "双引号@是:$@"
echo '单引号*是:$*'
echo "双引号*是:$*"
echo "@没有引号:"$@
echo "*没有引号:"$*
echo '这是双引号$@的遍历'
for i in "$@"
do
echo $i
done
echo '这是没有引号$@的遍历'
for i in $@
do
echo $i
done
echo '这是双引号$*的遍历'
for i in "$*"
do
echo $i
done
echo '这是没有引号$*的遍历'
for i in $*
do
echo $i
done
在使用 echo 命令时,总共会有3中情况,不加引号、加单引号、加双引号。
单引号的作用:所见即所得,不对内容作任何解析,输入什么,就输出什么。
双引号的作用:对输入内容中的特殊符号进行解析。
由于单引号最终的结果是将原内容重新输出,我们无法区分出 $@ 和 $* 的区别,在此处便没有讨论的意义,所以只有4个循环遍历的结构。
接下来执行脚本,并传递给脚本4个参数 a b c d
sh test.sh a b c d
最终的得到的结果如下:
[root@master scripts]# sh test.sh a b c d
单引号@是:$@
双引号@是:a b c d
单引号*是:$*
双引号*是:a b c d
@没有引号:a b c d
*没有引号:a b c d
这是双引号$@的遍历
a
b
c
d
这是没有引号$@的遍历
a
b
c
d
这是双引号$*的遍历
a b c d
这是没有引号$*的遍历
a
b
c
d
从执行脚本的结果我们不难发现:
1)单引号对变量内容不会作任何解析,所见即所得。
2)加双引号与不加双引号,$@
会把所有传递的参数内容输出,并且每个参数个体都是独立的。如脚本结果所示,几个参数,就遍历循环几次。
3)加双引号,$*
会把所有传递的参数内容输出,并且将所有参数作为一个整体。如脚本结果所示,4个参数,却只循环遍历了一次;不加双引号,作用与$@
相同。
4)一般使用时,尽量还是在echo
后面给输出的内容加上引号,一方面是为了更加规范,另一方面是,让我们所写的变量或者特殊符号去发挥它本应起到的作用,就像$@
和$*
一样。