免费注册 查看新帖 |

Chinaunix

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

请教一个expr的问题 - " numeric argument required". [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-23 21:21 |只看该作者 |倒序浏览
请教一个expr的问题:
下面这两个函数很简单,第一个从字符串里取出ip地址, 传给下一个函数。
可为什么老是出错说" numeric argument required", 明明是字符串截取啊。。。而且就算不调用第二个函数,干干的只执行第一个函数, 也还是有这个错误。谁能给指点一下,谢谢!


(当然也可以不这么写,整篇没有函数定义,没有参数传递,但不是为了进步么?!可郁闷的是半天高不定!)


func_getIP()
{
        eth0=192.168.0.1/24
        index=`expr index "$eth0" "/"`
        index=`expr $index - 1`
        ip=`expr substr $eth0 1 $index`

        return  "$ip"
}

func_ping()
{
     ping $1

}

func_getIP
addr="$?"
func_ping $addr

[ 本帖最后由 a_mug 于 2007-3-23 13:53 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-03-24 00:07 |只看该作者
把这句去掉换成个echo $ip试一试
#        return  "$ip"

PS:关于函数的return的用法, 见:  http://www.linuxsir.org/main/doc/abs/abs3.7cnhtm/functions.html

[ 本帖最后由 寂寞烈火 于 2007-3-24 00:12 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-03-24 00:42 |只看该作者
下面,函数间还是用
ip="$?"

的话,寂寞大侠的这招好像还是不管用。。。。
进!)

[ 本帖最后由 a_mug 于 2007-3-23 16:55 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2007-03-24 00:56 |只看该作者
原帖由 a_mug 于 2007-3-24 00:42 发表
寂寞大侠的这招管用!! 谢谢!!

追着再问一下:

加入文件a里就是三行
1
2
3
然后我用
lines=$(sed -n '1,$p' $a) <====这里错误!
count=${#lines[@]}

怎么count=1 呢? 我希望他们能到一个数组里啊!用 line =$ ...


try:

  1. lines=$(sed -n '1,$p' a)
  2. count=($lines) //bash声名数组的方法
  3. echo ${count[@]}
  4. echo ${#count[@]}
复制代码

btw:给你的链接要好好看

[ 本帖最后由 寂寞烈火 于 2007-3-24 00:57 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-03-24 01:35 |只看该作者
谢谢大侠!!在看,在看。。。

数组的问题,搞定,我的那个写法,不知道从哪里抄得,(汗!还是我以前自己的,好像还work过!)

函数返回值的问题,其实我刚刚在遇到这个问题前,刚成功过!

func_geteth_no()
{
        xmcfgfile=$1
        nics=$(sed -n  '/nics/p' $xmcfgfile)   // 文件里有这么一行:nics=3
        #echo $nics
        nicno=`expr substr $nics 6 1`
        ethno=`expr $nicno - 1` //这里,硬是把字符串,变成了数值,

        echo "nicno=$ncino, echno=$ethno"
        return "$ethno"      //   所以ethno这里加了双引号,就好了。感觉好像强制转换了一把
   

}

func_geteth_no
eth="eth$?"
func_writecfg_rclocal $eth $dst/etc/rc.local


//现在,就怎么也不好用了。。。。
func_getip()
{

     eth0=192.168.0.1/24
        index=`expr index "$eth0" "/"`
        index=`expr $index - 1`
        ip=`expr substr $eth0 1 $index`

        return  "$ip"   《=== A
}
func_getip
ech="$?"  // 从这句开始,就算没有,上面的语句A已经出错了!
func_work $eth

论坛徽章:
0
6 [报告]
发表于 2007-03-24 02:42 |只看该作者
通过读寂寞大侠给的连接, 大致明白了,谢谢寂寞大侠,(也希望走过路过的,不白进来,不对的地方,也请指正。。。)

教材里说:
======

**退出和返回

退出状态(exit status)
函数返回一个被称为退出状态的值. 退出状态可以由return来指定statement, 否则函数的退出状态是函数最后一个执行命令的退出状态(0表示成功,非0表示出错代码). 退出状态(exit status)可以在脚本中由$? 引用. 这个机制使脚本函数也可以像C函数一样有一个"返回值".

return

终止一个函数.return 命令[1]可选地带一个整数参数,这个整数作为函数的"返回值"返回给调用此函数的脚本,并且这个值也被赋给变量$?.


教材里还说:
=======

** 为了函数可以返回字符串或是数组,用一个可在函数外可见的变量.

** 函数最大可返回的正整数为255. return 命令与退出状态(exit status)的概念联系很紧密,而退出状态的值受此限制。幸运地是有多种(工作区workarounds)来对付这种要求函数返回大整数的情况.

所以,我的这两个函数, 一个是返回一个数值,所以成功,另一个返回的是字符串,看来shell 里不支持函数返回字符串!需要的时候,必须用个"全局变量"!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP