Shell中单、双引号,参数作用域和eval的问题学习

自定义一个net函数,目的是从ifconfig的输出结果中截取网卡的ip ,netmask和broadcast信息

##ip netmask broadcast
function net()
{
        name=$1
        num=\$$2
        /sbin/ifconfig -a | awk '{if ( $1 == "inet" && $5 == "broadcast") print "\t"$name $num}'
}
echo eth:
net ip 2

上面函数先调用一次以输出ip信息为例:(结果如图)

l

可以看到输出的结果完全不是想要的   ip 192.168.100.10

这是为什么呢??

下面说一下我的错误处理过程(错误错误错误

我是把函数改了一下

/sbin/ifconfig -a | awk '{if ( $1 == "inet" && $5 == "broadcast") print "\t"$name $num}'
改称:
echo "/sbin/ifconfig -a | awk '{if ( $1 == "inet" && $5 == "broadcast") print "\t"$name $num}'"

输出结果是:


分析一下:发现awk语句中的$1被替换成函数调用时传进来的第一个参数了。就自以为这个问题错误发生在awk不能区分自身截取出的$1字段和函数参数的$1段。

后来华哥帮忙看时告诉我这样的输出结果只是因为awk语句并没有执行而只是被 echo语句做了简单的弱引用替换成变量值

下面来介绍一下shell中的强引用和弱引用,还是以实例分析:

a=test
echo '$a'
echo "$a"
echo '"$a"'
echo "'$a'"

运行结果:


解释:   

            单引号: 强引用 (引号里面的内容全部当成字符串处理,如 echo '$a')         双引号:弱引用(有变量时,变量会被替换 ,如 echo "$a")    

           单引号和双引号都有时会以外面的为主(即外边的引号类型决定其里面内容是强引用还是弱引用,如 echo ' "$a" ':强引用    和  echo " '$a' " : 弱引用)

了解到上面的强引用和弱引用区别之后,回过头来考虑一下原来的问题,错误分析方法如下:


看到上面的情况,可以看出:awk的单引号也是 “强引用”,所以导致$name 和 $num 都不能传进入他们的值,所以都是空,awk就以两个$0 输出结果  

那么,“强引用”不可以,能不能把awk的单引号变成双引号呢?????   试一下:


显示语法错误说明不行,

可能有些朋友会问能不能用eval 语句(关于eval语句的使用讲解,详见下文)

测试一下:(如图)


可见eval的功能不能在awk里面使用

也就是说明这个函数的逻辑行不通,因为没有办法将函数的参数赋给awk。


下面我们再以一个函数例子来学习一下shell函数的返回值问题

function cpuinfo()
{
        $1=`cat /proc/stat | grep 'cpu ' | awk '{print "$2" "$3" "$4" "$5" "$6" "$7" "$8}'`
        $2=`echo $1 | awk '{print $5}'`
        $3=`echo $1 | awk '{print $1+$2+$3+$4+$5+$6+$7}'`
}
cpuinfo Log1 idle1 cpu1
echo $Log1 $idle1 $cpu1

说一下我函数的意图,我是想将函数的第一条语句赋给传进的第一个参数,以此类推.

运行以后发现错误


明显这种变量赋值方法是错误的。那么该如何才能实现自己的目的呢。

结合shell学习的知识。首先通过一个最简单的例子介绍一下eval用法,再做错误更正测试:


可以看出:eval可读取一连串的参数,然后再依参数本身的特性来执行。

关于 eval $v1=$vaaa;echo aaa:$aaa 和 eval "$v1=$vaaa";echo aaa:$aaa 的错误输出如下:


为什么会报这样的错误。从上面的eval作用思考:命令变成了 aaa=This is aaa这样当然会报错。双引号的弱引用也是这样。

只有单引号的强引用变成aaa=$vaaa

想仔细学习eval可参考:http://www.cnblogs.com/huzhiwei/archive/2012/03/14/2395956.html  

回到正题

我接下来做了如下测试:


就以为只要将例子中的变量a通过eval换成函数变量传入的$1就可以了呢。就修改了函数的内容,并测试了一下。


发现还是错误。........................................................................................................................

最后还是决定使用另一种方法解决函数多次使用赋值的问题。如下:


这里牵扯到了函数的变量值作用域知识点。它和c语言不同。这一点也可以通过上面的例子看出。

详细学习可以看出参照文章:http://blog.csdn.net/ithomer/article/details/7954577






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值