shell脚本基础编程第四篇
本章主要内容:函数
函数
function:
function 名称 { 命令 ; } 或 name () { 命令 ; }
定义 shell 函数。
创建一个以 NAME 为名的 shell 函数。当作为一个简单的命令启用时,
NAME 函数执行调用 shell 的上下文中的 COMMANDs 命令。当 NAME
被启用时,参数作为 $1...$n 被传递给函数,函数的名字储存在变量
$FUNCNAME 中。
函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程
与shell程序形式上是相似的,不同的是他不是一个单的进程,
不能独立运行,而是shell程序的 一 部分。
函数由两部分组成:函数名和函数体
语法:
function f_name {
...函数体..
}
语法:
f_name() {
...函数体...
}
函数的定义和使用:
可在交互式环境下定义函数
可将函数放在脚本文件中作为它的一部分
可放在只包含函数的单独文件中
调用:函数只有被调用才会执行
调用:给定的函数名
函数名出现的地方,会被自动替换为函数代码
函数的生命周期:被调用时创建返回时终止
函数返回值:
函数的执行结果返回值:
使用echo或printf命令进行输出
函数体中调用命令的输出结果
函数的退出状态码:
默认取决与函数中执行的最后一条命令的退出状态码
自定义退出状态码:
return 从函数中返回,用最后状态命令决定返回值
return 0 没有错误返回
return 1-255 有错误返回
==========================================================================
命令行举例,交互式环境下举例
[root@Compro ~]# function fun1(){ echo "xiaomag";} 在一行里面要加上;分号
[root@Compro ~]# fun1
xiaomag
定义函数名称为fun1,函数体为输出xiaomag; 然后直接输入fun1函数名,输出的内容为xiaomag
==========================================================================
shell脚本间简单举例
[root@Compro ~]# vim fun2.sh
#!/bin/bash
#
#user:Compro
#简单定义函数名称,函数体可以是命令,下面看下几个简单的命令
fun2(){ 这个算是在脚本中嵌入了函数
who
pwd 函数一般在文件的前面;调用文件的前面;
ifconfig 如果把下面的echo放在最前面,会导致不能调用这个函数;
ls
hostname 执行后会显示这几条命令的结果返回值
echo "执行函数fun2结果" 当所有函数执行结束后,显示打新输入一句话;也可以说是返回值
}
echo "执行函数fun2开始" 在这个函数体执行的开始输出显示
fun2
echo "执行函数fun2结束" 执行上面结果结束后最后显示
函数在使用前必须定义,因此应该将函数定义放在脚本的开始 ,
直到shel首次发现函数体后才能使用;调用函数体仅使用定义好的函数名就可以。
注意:在脚本里面定义的函数,不能在命令行下单独使用,因为不在一个shell进程,两边不想干
==========================================================================
set可以产看显示定义的变量。以及函数;
该定义的函数将一直保留到用户从系统退出,或执行了 unset fun1 取消函数定义
函数优先级:
别名
函数
内部
外部
使用函数文件:
可以将经常使用的函数存入函数文件,然后将函数文件载入shell中。
文件名可任意的选取,但是最好与相关任务有某种联系。
例如:functions.main
==========================================================================[root@Compro ~]# vim funs 创建函数文件
#/bin/bash
fun3(){ 函数名
echo "xiaomag" 函数体
}
funn4(){ 函数名
edho "xiaomage" 函数体
} 可以定义多个函数
==========================================================================
当函数文件定义好以后,需要加载到当前shell才能使用,就可以在命令行或脚本中调用函数,
可以使用set命令查看并检查所有定义的函数,
其输出列表包括已经载入shell的所有函数。
加载函数文件到当前shell:. filename 或者 source filename
注意:.点 空格 文件名 这里的文件名要带正确路径
执行shell函数:
[root@Compro ~]# fun3
xiaomag
[root@Compro ~]# fun4
xiaomage
==========================================================================
若是要改动函数,首先用unset命令从shell中删除函数,改动完毕后,才重新载入此文件。
现在对函数做一些改动。首先删除函数,使其对shell不可用。使用unset命令完成此功能
命令格式为:unset 函数名称
[root@Compro ~]# unset fun4 这样shell中 set就没有个这函数了
==========================================================================
在shell脚本中调用函数文件中的函数
[root@Compro ~]# vim testfuns.sh 脚本
#/bin/bash
source funs 在脚本里面调用funs函数文件中的函数;如果函数文件要是跟这个脚本不在一个路径下,要写清楚路径
fun3 函数名
fun4 函数名
==========================================================================
函数参数:
传递参数给函数:调用函数时,在函数名后面以空白分隔给定参数列表即可;
例如 fun1 变量1 变量2 ...
在函数体当中可使用$1 $2 ... 调用这些参数;还可以使用$@,$*,$# 等特殊变量
函数变量:
环境变量:当前shell和子shell有效
本地变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程,
因此,本地变量的作用范围是当前shell脚本程序文件,包括脚本中的函数
局部变量:函数的生命周期;函数结束时变量自动销毁
注意:如果函数中有局部变量,如果其名称同本地变量,使用局部变量。
在函数中定义局部变量的方法:
local 变量名=变量值 函数内部有效。不加local是本地变量,加上是局部变量
函数递归:
函数直接或间接调用自身
注意递归层数
举例
fun (){echo fun;fun;} 死循环,直到一定的程度会退出当前shell终端
fun () { let i++;echo $i;fun;} 递增i循环。直到当前系统资源耗尽退出当前shell终端
10!=10*9!=10*9*8!=10*9*8*7!=...
n!=1*2*3....*n
(n-1)!=1*2*3....*(n-1)*n=n!
fun(
echo fun n-1 * n
)
==========================================================================
vim fact.sh
#/bin/bash
#
#user:Compro
fact(){ 阶乘函数
if [ $1 -eq 0 -o $1 -eq 1 ];then调用 $1等于0 0的阶乘等于1 或者 $1等1 1的阶乘是1
echo 1如过给的数值是0或者是1就打印1
else如果给的不是0也不是0
echo "$[ $1*` fact $[$1-1]`]"$1*调用函数自己$1-1的值 它们的阶乘
fi
}
fact $1通过调用函数的值$1
==========================================================================
执行结果
[root@Compro ~]# bash fact.sh 1
1
[root@Compro ~]# bash fact.sh 2
2
[root@Compro ~]# bash fact.sh 3
6
[root@Compro ~]# bash fact.sh 4
24
[root@Compro ~]# bash -x fact.sh 4
+ fact 4
+ ‘[‘ 4 -eq 0 -o 4 -eq 1 ‘]‘
++ fact 3
++ ‘[‘ 3 -eq 0 -o 3 -eq 1 ‘]‘
+++ fact 2
+++ ‘[‘ 2 -eq 0 -o 2 -eq 1 ‘]‘
++++ fact 1
++++ ‘[‘ 1 -eq 0 -o 1 -eq 1 ‘]‘
++++ echo 1
+++ echo 2
++ echo 6
+ echo 24
24
·
本文出自 “小马哥Linux系统运维” 博客,转载请与作者联系!
原文地址:http://xiaomag.blog.51cto.com/11842517/1841261