Shell编程——函数的使用
Shell 函数的本质是一段可以重复使用的脚本代码,这段代码是事先写好的,放置在特定的地方,当需要的时候可以随时调用。
1、系统函数
basename
功能:返回文件路径最后/的部分,用于获取文件名
语法格式:
basename [pathname/string] [suffix]
suffix作为后缀,在指定 suffix时, basename将删除 pathname或 string中的 suffix。
使用实例:返回 /home/test1.sh 的 “test1.sh” 部分
[root@haoming home]# basename /home/test1.sh
test1.sh
指定去除的后缀:返回 /home/test1.sh 的 “test1” 部分
[root@haoming home]# basename /home/test1.sh .sh
test1
dirname
功能:返回完整路径最后 / 的前面的部分,用于返回文件的绝对路径部分
语法格式:
dirname 文件绝对路径
使用实例:返回 /home/test1.sh 的 /home
[root@haoming home]# dirname /home/test1.sh
/home
编写shell文件测试:
#!/bin/bash
#获取文件名
echo filename = $(basename $0)
#获取文件路径
echo filepath = $(dirname /home/test1.sh )
执行shell文件:
[root@haoming home]# ./test1.sh
filename = test1.sh
filepath = /home
2、自定义函数
定义函数的格式:
[function] funname() {
Action
[return int]
}
对各个部分的说明:
function
: Shell 中的关键字,专门用来定义函数,可以使用,也可以不使用。如果使用了function
,那么函数名的小括号()就可以省略;funname
:表示函数名称;Action
:是函数要执行的一组语句;return int
:表示函数的返回值,return后面跟数值,范围是0-255,如果不加返回值,函数将以最后一条语句的执行结果作为返回。使用$?
可以得到函数的退出状态。
注意事项:
-
在调用函数之前必须先声明函数,因为shell脚本是逐步运行的;
-
由
{ }
包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。 -
Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。
使用实例
定义一个函数,实现控制台读取两个数字并相加:
编写shell脚本文件:
#!/bin/bash
#定义函数
function add(){
s=$[$1+$2]
echo $s
}
read -p "请输入第一个数字:" a
read -p "请输入第二个数字:" b
#调用函数,并传递参数 $a $b
sum=$(add $a $b)
echo "sum=$sum"
执行shell文件:
[root@haoming home]# ./test1.sh
请输入第一个数字:90
请输入第二个数字:900
sum=990
3、文件自动归档实现
需求:编写一个每天对指定目录进行归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件每天进行归档保存,并将归档日期附加在归档文件名上,放在/home/archive 下。
shell文件:
#!/bin/bash
# $#获取传递的参数个数,只允许传一个文件目录进行备份
if [ $# -ne 1 ]
then
echo "错误信息:备份文件数不为1"
exit
fi
#判断是否是目录
if [ -d $1 ]
then
echo
else
echo "目录不存在"
exit
fi
#获取备份文件名称和路径
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)
#获取当前日期,年月日
DATE=$(date +%y%m%d)
#定义生成的备份文件和路
FILE=archive_${DIR_NAME}_$DATE.tat.gz
DEST=/root/archive/$FILE
#执行归档操作 c:归档操作,z:压缩,f:指定备份文件
echo
echo "开始归档操作:"
tar -czf $DEST $DIR_PATH/$DIR_NAME
#判断归是否成功
if [ $? -eq 0 ]
then
echo "归档成功"
echo "归档文件为:$DEST"
else
echo "归档失败"
echo
fi
exit
执行shell文件,对/usr目录下的myblog文件进行备份:
[root@haoming home]# ./daliy_archive.sh /usr/myblog
开始归档操作:
tar: Removing leading `/' from member names
归档成功
归档文件为:/root/archive/archive_myblog_220615.tat.gz
将文件备份脚本添加到定时任务中执行
查看当前用户定时任务:
[root@haoming home]# crontab -l
no crontab for root #没有任务
添加定时任务,
命令:crontab -e
0 5 * * * /home/daliy_archive.sh /usr/myblog
解释:每天五点整执行脚本文件