LinuxAwk命令详解之自定义函数

治疗白斑的费用贵吗 http://www.bdfyy999.com/bdf/yufangbaojian/ziwozhenduan/m/50481.html

上一节我们介绍了awk数组,了解到了数组的使用、删除、遍历以及使用。然而一门编程语言缺少了函数,那肯定不是完整的。awk不止有内置的函数,还允许用户自定义函数,其实在数组一节中的排序已经讲到了自定义函数,本节我们来讨论一下awk的自定义函数,函数变量作用域等知识点。

1.函数定义

awk中的函数与js的函数定义格式很像,如下:

functionname([parameter-list]){body-of-function}name是要定义的函数名称,名称规则:字母,数字和下划线的开头,它们不能以数字开头。parameter-list是函数参数和局部变量名称的可选列表,以逗号分隔。函数不能有两个相同名称的参数,也不能具有与函数本身具有相同名称的参数。如果不传入则为初始默认值。调用函数时提供的参数数量决定了有多少个参数变量。因此,如果给出了三个参数值,则·parameter-list·中的前三个名称是参数,其余的是局部变量(下面有案例介绍)。body-of-function就是awk的代码主体了。2.函数使用

我们先来定义一个自定义函数(保存到test.awk),并使用它:

#此函数是格式化打印数值functionmyprint(num){printf"%6.3g\n",num;}

[work

magic-~]echo1.

awk-e{myprint(0);}-ftest.awk1..变量作用域

awk中变量很坑爹,与其它语言不同的是无法在{...}约束在括号中,但是可以使局部变量作用在函数中。要想变量约束在函数中,只需要将变量声明在函数的参数之后。我们先来看一下变量作用域的问题。如下所示:

functiontest(){for(i=0;i3;i++)print"testfunctionlocalvariable:"i;}functionvvvv(j){print"vvvvfunctionlocalvariable:"i;i=j+i;print"vvvvfunctionlocalvariable:"i;}

我们调用一下此函数:

[work

magic-~]echo""

awk-e{i=10;printi;test();vvvv(4);printi;}-ftest.awk10testfunctionlocalvariable:0testfunctionlocalvariable:1testfunctionlocalvariable:2vvvvfunctionlocalvariable:3vvvvfunctionlocalvariable:77

可以看到,变量i在test函数中进行重新赋值,但是外部的i也跟着函数内变化了。这个在其它编程语言中基本没这么玩儿的。怎么破其实很简单,我们只需要如下定义:

functiontest(i){for(i=0;i3;i++)print"testfunctionlocalvariable:"i;}functionvvvv(j,i){print"vvvvfunctionlocalvariable:"i;i=j+i;print"vvvvfunctionlocalvariable:"i;}

再执行一下我们看看:

[work

magic-~]echo""

awk-e{i=10;printi;test();vvvv(4);printi;}-ftest.awk10testfunctionlocalvariable:0testfunctionlocalvariable:1testfunctionlocalvariable:2vvvvfunctionlocalvariable:vvvvfunctionlocalvariable:

相信已经解决了变量作用域的问题了。比较坑爹的就是我们如果用到了很多的本地变量,那么我们需要在函数中定义太多的本地变量了,这个是比较麻烦的事情。不过我们可以使用本地数组来解决这个问题,我们看一下:

functiontest(a){a["a"]=10;print"testfunctionlocala-avariable:"a["a"];a["b"]=0;for(a["b"]=0;a["b"]3;a["b"]++)print"testfunctionlocala-bvariable:"a["b"];}

调用一下看看:

[work

magic-~]echo""

awk-e{a["a"]=1;printa["a"];v();printa["a"];}-ftest.awk1vfunctionlocala-avariable:10vfunctionlocala-bvariable:0vfunctionlocala-bvariable:1vfunctionlocala-bvariable:21

这样的话,我们如果函数中有很多的变量,可以都交给本地数组来维护。这里要注意一点,函数的参数是约束在函数局部作用域中的,可以通过如下来看:

function



转载请注明地址:http://www.sanbaicaoasb.com/scls/8517.html
  • 上一篇文章:
  • 下一篇文章: 没有了
  • 热点文章

    • 没有热点文章

    推荐文章

    • 没有推荐文章