免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5156 | 回复: 11
打印 上一主题 下一主题

$@和$*的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-18 18:06 |只看该作者 |倒序浏览
自己刚学Shell,在书上看的是$@保存引用,而$*不保存引用。似懂非懂,自己做了个实验,却发现了很多迷茫的地方,还请各位大侠指点下!
#!/bin/bash

echo "test \$@"
for i in $@
do
        echo $1
done
echo "test \$*"
for i in $*
do
        echo $1
done

[root@Server test]# ./test "1 2" 4
test $@
1 2
1 2
1 2
test $*
1 2
1 2
1 2
按照我预期的结果,我想应该是第一个for循环出两次1 2,而第二个应该是出三次1吧!~这里我还是不太懂!!
#!/bin/bash

echo "test \$@"
for i in "$@"
do
        echo "$1"
done
echo "test \$*"
for i in "$*"
do
        echo "$1"
done

[root@Server test]# ./test "1 2" 4
test $@
1 2
1 2
test $*
1 2
而这里我就更奇怪了,为什么我的代码没改,就对加了双引号,结果循环的次数就改变了,更是想不通。
for((i=0;i<10;i++))
do
        for((j=$i+1;j<10;j++))
        do
                 echo "test"
        done
done
对于第二个for循环,还有这样的for((j=i+1;j<10;j++))结果是,都一样,不报错,我明白这里,严格的写应该怎么写才算规范呢!

我刚学Shell编程,想把基础打牢固些,大侠受累下,帮我解决下吧!

论坛徽章:
0
2 [报告]
发表于 2009-04-18 18:26 |只看该作者
for i in "$@"

for i in "$*"

加上引号就可以用$@和$*了,这个用法记往就行了

$@将所有的参数看作是一个独立的参数
$*将每个参数看作是单独的

[ 本帖最后由 changzi100 于 2009-4-18 18:32 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2009-04-18 18:33 |只看该作者
这样比较一下
for i in $@;do echo $i;done
for i in "$@";do echo $i;done

论坛徽章:
0
4 [报告]
发表于 2009-04-18 18:41 |只看该作者

回复 #3 寂寞烈火 的帖子

我测试了,没什么区别,可还是不知道,为什么我那里的循环测试就不一样了!还有二楼的仁兄,你说的这个我在书上看到过,但出来的效果和我理解的不一样,所以还麻烦你再详细介绍下,最好举个例子!呵呵,要求有点高撒!没办法,新手,理论不太扎实,谢过了!

论坛徽章:
0
5 [报告]
发表于 2009-04-18 19:10 |只看该作者
"$@" 和 $@的区别

"argv1 argv2 argv3" 和 argv1 argv2 argv3的区别

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
6 [报告]
发表于 2009-04-18 19:38 |只看该作者

回复 #4 scott_1987 的帖子

哪里不明白?

论坛徽章:
0
7 [报告]
发表于 2009-04-18 20:29 |只看该作者
四楼的给出的那个我就不太明白,还有就是他们两个的区别,理论上知道,但实际运用就不知道了!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2009-04-18 20:48 |只看该作者

回复 #7 scott_1987 的帖子

$@经过参数展开后,还要word splitting,


"$@"经过参数展开后,不再word splitting.

对于"1 2" 4, $@参数展开后:"1 2", "4", word splitting后得到三个字(word): 1, 2,4

"$@"参数展开得到两个字:"1 2","4".

[ 本帖最后由 blackold 于 2009-4-18 20:50 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-04-19 02:01 |只看该作者

回复 #8 blackold 的帖子

明白了!不过对于$@和$*的区别,我还是在运用时不明白!

论坛徽章:
0
10 [报告]
发表于 2009-04-19 08:45 |只看该作者
原帖由 scott_1987 于 2009-4-19 02:01 发表
明白了!不过对于$@和$*的区别,我还是在运用时不明白!


不回引号时, $@ 和 $* 相同

加双引号时
参数: "1 2" 4
"$@"  表示所有的参数,即 "1 2" 4
"$*" 表示把所有的参数扩展并形成一个字符串 "1 2 4"


  1. set -- "1    2"  4
  2. 现在有两个参数: "1    2" 和 4
  3. for i in $@;do echo "[$i]";done
  4. [1]
  5. [2]
  6. [4]
  7. 空格没有了
  8. for i in $*;do echo "[$i]";done
  9. [1]
  10. [2]
  11. [4]
  12. 空格没有了
  13. for i in "$@";do echo "[$i]";done
  14. [1    2]
  15. [4]
  16. 完整的两个参数,与你先前输入的参数一样
  17. for i in "$*";do echo "[$i]";done
  18. [1    2 4]
  19. 就剩一个字符串了,但是,第一个参数的空格仍然是保留的。
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP