awk 如何调用Linux函数,awk-语法深入-用户自定义函数

- 自定义函数格式

awk 自定义函数获取参数,选择性的返回标量值,函数可以在程序的顶层任意位置定义。自定义格式为:

function name(arg1,arg2,....argn){

statement(s)

}

4b5a55117e0f78dd84ca0e4ae5e7bb65.png

在自定义的函数中,指定的参数被当作局部变量,他们会隐藏任何同名的全局性变量。

调用函数的格式:

function(expr1,expr2,...)# 忽略任何返回值

result=function(expr1,expr2,...)# 将返回值存储在变量中

自定义函数时,所有位于函数体内部且未出现在函数参数列表中的变量,awk都将视之为全局变量。

awk允许调用函数时,被调用函数中的参数比它定义时所声明的参数还少,这样额外的参数(既没有被传递值的参数)被视为局部变量,对于这类变量,一般将它列在自定义的函数的参数列表,并且字首前置一些空白。这个额外的参数通常初始化为空字符串.

eg.

funchtion add(x,y  sum) // sum 就是一个局部变量,初始化为空字符串

{

sum=x+y

returnsum /

}

a=add(1,2)// 传递的参数少于函数add()定义时的数量

printf("m: %d\n",a)

e5876a97ba329248a9c8a15c5bb425d8.png

- 值传递和地址传递(引用传递):

值传递是将变量的值传给了函数的形参,变量本身并未改变,还是原来的值。

地址传递是将变量的地址传递给了函数的形参,被调用函数会通过变量的地址找到变量被定义的地方,进而对变量作出改动,与变量的值改变。

awk不支持取址操作,因此awk中普通变量为值传递,awk的数组则默认为地址传递。

- 递归调用

awk函数支持自己调用自己。

应用场景: 某些不断执行相同逻辑的的程序.

eg. 求斐波那契数列(Fibonacci sequence)的某一项

fibonacci.awk

function fibonacci(nth)

{

if(nth==1||nth==2)

return1

else

returnfibonacci(nth-1)+fibonacci(nth-2)// 递归

}

######执行体###########################

{

n=$1// 第一个字段

printf(" %dth of fibonacci sequence is: %d\n",n,fibonacci(n))

}

问题: 复杂度大,求第n项时需要把前n-1项都计算一遍!

e5876a97ba329248a9c8a15c5bb425d8.png

解决:使用数组,把所有求过的项保存起来,再求新的项时,直接调用。

总结: print 与 printf 的区别:

print 输出的内容后会自动换行

printf 不会自动换行,需要添加'\n';还可以自定义输出格式.

[root@web1function]#echo-e"1\n2\n34\n43\n23"|awk'{print "Number is: " $1}'

Numberis:1

Numberis:2

Numberis:34

Numberis:43

Numberis:23

[root@web1function]#echo-e"1\n2\n34\n43\n23"|awk'{printf "Number is: " $1;} END{printf "\n"}'

Numberis:1Numberis:2Numberis:34Numberis:43Numberis:23

[root@web1function]#echo-e"1\n2\n34\n43\n23"|awk'{printf "Number is: " $1 "\n"}'

Numberis:1

Numberis:2

Numberis:34

Numberis:43

Numberis:23

0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值