赞
踩
至于区别,先来看shell代码和执行结果
cd /home/hadoop/shell/examples
vim paramter2.sh
文件内容为:
#!/bin/bash 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
执行shell脚本【首先明确一点:给shell传入参数时,多个参数间是用空格隔开的】
cd /home/hadoop/shell/examples
sh paramter2.sh "abcdef" yyy
sh paramter2.sh "abc def" yyy
sh paramter2.sh "abc def ghi" yyy
sh paramter2.sh " abc def ghi" yyy
sh paramter2.sh " abc def ghi " yyy
执行结果:
从上面执行结果来看:
1)echo 直接输出$*、$@、"
∗
"
、
"
*"、"
∗"、"@" ,它们之间是有区别的,都是将所有参数用空格连接成一份数据.连接前有些参数被处理过,有些没被处理,后面会给出总结。
使用 for 循环来逐个输出数据,更能看出区别来。
2)不被双引号""包围的
∗
和
*和
∗和@ 是逐个对参数内部再按空格拆分,并去掉前后空格,然后连接在一起表示所有参数,遍历出来的参数个数和参数值都有可能跟输入时不一样了。
在sh paramter2.sh " abc def ghi " yyy
命令中,有两个参数。
第一个参数" abc def ghi "
实际上是由3个字符串组成,abc与def之间有1个空格,def与ghi之间有2个空格,abc前面有1个空格,ghi后面有1个空格,会被处理成3个参数abc
、def
、ghi
第二个参数yyy
,因为内部没有空格,前后也没空格,所以还是它自己。
所以被处理后的第一个参数分成了3个参数,加上第二个参数1个参数,一共4个参数,这4个参数空格连接在一起就是abc def ghi yyy
3)被双引号"“包围的”$*"、"$@“是把所有参数值原封不动(参数内部有空格不进行拆分,值前后的空格也都完整保留)的用空格连接成一份数据,只是”$*“连接成铁板一块,而”$@“还保留着连接点,还能获得某个完整参数值!!
在sh paramter2.sh " abc def ghi " yyy
命令中,有两个参数。
第一个参数" abc def ghi "
,第二个参数yyy
,用空格直接连接在一起为 abc def ghi yyy
,这就是”$*"、"$@“的输出值。它们的差别在遍历的时候就能看出,”$*“只遍历出一个参数,即连接后的完整值,可以看出”$*“是将所有参数连接成铁板一块了;而”$@"遍历出2个参数,每个参数就是之前的参数输入值
总结:
1)$*、$@ 、"$*"、"$@“都表示传递给函数或脚本的所有参数,即都会将所有参数处理成一份数据。
2)不被双引号”"包围的$*和$@,会对每个参数进行处理,逢空格必拆开,去前后空格,最后会被处理的连爹妈都认不出来。可以说家教严格,稍带空格就会被修理,哈哈~~
3)被双引号"“包围的”$*"、"$@",不会对每个参数进行处理,而仅仅是将所有参数值原封不动的用空格连接成一份数据,只是"$*“连接成铁板一块,而”$@“还能获取到每个完整的参数值!!
所以”$*“是被合并的连爹妈都认不出来,而”$@"还能被爹妈准确认领出来的,哈哈!!
反正我就记忆完整性最好的是"$@",参数值唯一能被爹妈准确认领出来的。在生产上,也是用"$@"最多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。