Shell函数的定义、执行、传参和递归函数



Bash(Bourne Again shell)也跟其他编程语言一样也支持函数,一般在编写大型脚本中需要用到,它可以将Shell脚本程序划分成一个个功能相对独立的代码块,使代码的模块化更好,结构更加清晰,并可以有效地减少程序的代码量。但是bash作为一种解释性语言,bash 在编程能力方面提供的支持并不像其他编译性的语言(例如 C 语言)那样完善,执行效率也会低很多。

shell函数的定义、执行与传参

定义

格式1

function name() {
 Command sequence(命令序列);
}

格式2

name() {
 Command sequence(命令序列);
}

可以带function name()定义,也可以直接name()定义,不带任何参数。 

执行

name;

直接使用函数名称即可调用某个函数。

传递参数

#!/bin/bash
aa="this is aa"
bb="this is bb"
function name() {                  #定义函数name
        local cc="this is cc"      #定义局部变量$cc
        local dd="this is dd"      #定义局部变量$dd
        echo $aa, $bb              #访问参数1和参数2
        echo $cc                   #打印局部变量
        return 0                   #shell函数返回值是整形,并且在0~257之间。
}

echo $dd                           #这里将会打印不生效,因为dd是局部变量。
name                               #使用函数name

上例中:

  • aa 和 bb 定义的是全局变量。
  • cc 和 dd 定义的是局部变量,只能在函数 name 中使用。
  • $aa是第一个参数$1$bb是第一个参数$2,以此类推$n是第n个参数$n
  • return 0参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果作为返回值。

递归函数

bash也支持递归函数(能够调用自身的函数)例如:

#!/bin/bash

function name() {
        echo $1
        name hello
        sleep 1
}
name

运行此脚本后不断打印出hello,按Ctrl+C结束。

递归经典:fork 炸弹

可能很多人都曾经听说过 fork 炸弹,它实际上只是一个非常简单的递归程序,程序所做的事情只有一样:这个递归函数能够调用自身,不算的生成新的进程,这会导致这个简单的程序迅速耗尽系统里面的所有资源,造成拒绝服务攻击。

.()
{
.|.&
}
;
.
  • 第 1 行说明下面要定义一个函数,函数名为小数点,没有可选参数。
  • 第 2 行表示函数体开始。
  • 第 3 行是函数体真正要做的事情,首先它递归调用本函数,然后利用管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行。
  • 第 4 行表示函数体结束。
  • 第 5 行并不会执行什么操作,在命令行中用来分隔两个命令用。从总体来看,它表明这段程序包含两个部分,首先定义了一个函数,然后调用这个函数。
  • 第 6 行表示调用本函数。 
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值