LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2456|回复: 23

$@和$*的问题!!!

[复制链接]
发表于 2006-2-17 20:58:46 | 显示全部楼层 |阅读模式

  1. set -- "First Arg" "Second" "Third:Arg" "" "Fifth: :Arg"

  2. IFS=:

  3. var=$@
  4. var1=$*

  5. echo "$var"                # First Arg Second Third Arg  Fifth   Arg
  6. echo "$var1"              # First Arg:Second:Third:Arg::Fifth: :Arg

  7. IFS=

  8. var=$@
  9. var1=$*

  10. echo "$var"                # First Arg Second Third:Arg  Fifth: :Arg
  11. echo "$var1"              # First Arg Second Third:Arg   FFiifftthh::  ::AArrg
复制代码


bash的man文档和精华帖都有所浏览,但是好像只有对这两个特殊变量被double quoted以后的一些解释,为何上述命令会出现如下结果,小弟实在不能理解,希望哪位高手能帮小弟解答,那将不慎感激!
 楼主| 发表于 2006-2-19 12:53:38 | 显示全部楼层
哎,没人气啊,我自己顶!
回复 支持 反对

使用道具 举报

发表于 2006-2-20 10:35:42 | 显示全部楼层
不是没人气的问题。shell版帖子的回复率是很高的。你的帖子我看了,自己也琢磨着这些问题。你的例子abs上有,我看过。但是当时没有过多注意,因为毕竟以那种形式出现的参数实例中并不多见。我个人理解是这样的。$@和$*对于参数的处理过程有可能是不一样的。$@和$*都会根据IFS来分离参数元,但当$@和$*赋值给另一个变量时,$@和$*所赋予的值不同,$@将参数赋予变量,参数之间仍是使用缺省的分隔符,而$*则是将参数和分隔符一起全部赋予给变量(我理解是将那串string)。也就是说无论IFS是什么,$@依IFS的定义将参数分隔,然后以以缺省的分隔符分隔他们,而$*不作这个动作,只是简单的标记分隔符的位置。所以在任何时候,你不会看见"$@"或$@中有你自定以的IFS标记,因为它已经处理完了。而"$*"则会。不知是否回答了你的问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-20 15:52:11 | 显示全部楼层
Post by yongjian
不是没人气的问题。shell版帖子的回复率是很高的。你的帖子我看了,自己也琢磨着这些问题。你的例子abs上有,我看过。但是当时没有过多注意,因为毕竟以那种形式出现的参数实例中并不多见。我个人理解是这样的。$@和$*对于参数的处理过程有可能是不一样的。$@和$*都会根据IFS来分离参数元,但当$@和$*赋值给另一个变量时,$@和$*所赋予的值不同,$@将参数赋予变量,参数之间仍是使用缺省的分隔符,而$*则是将参数和分隔符一起全部赋予给变量(我理解是将那串string)。也就是说无论IFS是什么,$@依IFS的定义将参数分隔,然后以以缺省的分隔符分隔他们,而$*不作这个动作,只是简单的标记分隔符的位置。所以在任何时候,你不会看见"$@"或$@中有你自定以的IFS标记,因为它已经处理完了。而"$*"则会。不知是否回答了你的问题。


多谢 yongjian 兄,

确实你的解答回答了我的问题,而且我一开始的思路和你是一样的,但是仍然有一点不是很明白.如果按照bash的命令解释原理,当bash替换了变量后,不是应该用IFS对其进行分割吗?那这样一来的话,命令不就变成了如下的模样了...


  1. IFS=:

  2. var=$@                      # var=First Arg Second Third Arg  Fifth   Arg
复制代码


这样一来,不就应该出错了吗?是不是变量赋值与命令解释有不同之处?
也许是小弟本身的理解有误.还有abs是哪里啊?
刚刚涉及linux,所以不甚了解,希望yongjian兄不要嫌小弟麻烦,能为之解答一二.
回复 支持 反对

使用道具 举报

发表于 2006-2-21 03:08:47 | 显示全部楼层
哪里出错呢?变量赋值前shell要对变量所指的数据解释,所以和命令解释没有不同。都得到所指的数据结果。
  1. echo $@
复制代码
得到的是一样的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-21 09:43:18 | 显示全部楼层
Post by yongjian
哪里出错呢?变量赋值前shell要对变量所指的数据解释,所以和命令解释没有不同。都得到所指的数据结果。
  1. echo $@
复制代码
得到的是一样的。


也许我表达的不够清楚,我的意思是
a='a b'
b=$a

象上面的指令$a被替换成a b,这样一来的话,b=$a不就变成b=a b,这样不是就有问题了吗我就是对这个有点不理解,也许是我的基础概念还没搞清吧
回复 支持 反对

使用道具 举报

发表于 2006-2-21 10:26:59 | 显示全部楼层
Post by johnny_jiang
也许我表达的不够清楚,我的意思是
a='a b'
b=$a

象上面的指令$a被替换成a b,这样一来的话,b=$a不就变成b=a b,这样不是就有问题了吗我就是对这个有点不理解,也许是我的基础概念还没搞清吧

有什么问题呢?
  1. echo $b
复制代码
显示a b,和$a一样。问题在哪呢?
回复 支持 反对

使用道具 举报

发表于 2006-2-21 10:40:38 | 显示全部楼层
abs - advanced bash scripting. tldp.org 上有。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-21 14:33:21 | 显示全部楼层
如果在命令行上直接写入命令
a=a b
肯定不行的吧.
我就是觉得如果进行了变量替换后不是和上面的形式一致了?
回复 支持 反对

使用道具 举报

发表于 2006-2-21 22:43:29 | 显示全部楼层
不是。这是完全不同的。当你输入变量值时,必须依照shell的语法规定,即如果有IFS分隔在变量值中出现,必须由单/双引号括起。当赋值完成之后,变量得到指向数值的内存地址。转递时,新变量得到一个拷贝,和原来的一模一样。当打印时,bash根据命令行规则分隔和去处单/双引。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表