1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
#格式1
function name(){
command sequence(命令序列);
}
#格式2
name() {
command sequence(命令序列);
}
#执行的话直接
name;
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
#!/bin/bash
sum(){
echo "---函数开始执行---"
read -p "input first:" a
read -p "input second:" b
echo "$a + $b = $(($a+$b))"
echo "---函数结束执行---"
return $((a+b))
echo "这行不会执行"
}
echo "原先状态码:$?"
sum #这是函数调用
echo "执行函数后的状态码:$?"
echo "再次查看状态码:$?"
输出结果
定义变量
#!/bin/bash
a="this is a" #全局变量
b="this is b" #同上
name(){
local c="this is c" #局部变量
local d="this is d" #同上
echo $a,$b #输出参数$a,$b
echo $c,$d #输出局部变量
return 0 #自定义返回,如果不加,将最后一条命令运行结果作为返>回值
}
echo "d:$d"
echo "a:$a"
name
递归函数
#!/bin/bash -x
function name() {
echo $1
name hello #自身调用,会不断输出hello
sleep 1
}
name
-------------------------------------------------------------------
递归:(fork 炸弹):程序所作的事情只有一样,这个函数能够调用自身,不算生成新的进程,这会导致这个简单的程序迅速耗尽系统里面所有资源,造成拒绝服务攻击。(虚拟机试试就行了)
#!/bin/bash
.() #定义一个函数,函数名为".",没有可选参数
{ #函数体开始
.|.& #他递归调用本函数,利用管道调用一个新进程,做的事情也是递归调用本函>数,并且放到后台执行
} #函数体结束
; #不会执行任何操作,在命令行中分割两个命令用,表明这段程序包含两部分>(首先定义了一个函数,然后调用这个函数)
. #上面是调用本函数