目录
basename [string/pathname] [suffix]
一、系统函数
(一)前言
shell中函数、脚本、命令意思有些相似,都是指为了实现某个功能的一段代码的集合,可以包装起来完成某些功能。
shell会提供一些既有的可以直接执行调用的脚本,系统函数也分为内置外置,比如外置的脚本直接放在 /bin 目录下,就可以直接执行了
如date函数,显示时间及时间戳
[root@hadoop-master sh_func_test]# date
2024年 10月 22日 星期二 16:42:05 CST
[root@hadoop-master sh_func_test]# date +%s
1729586538
写入脚本:
- date后面一定要加一个空格
- 在这里,相当于调用了date函数,再使用+%s的参数,然后用$()包起来
- 所有的命令都能在脚本里作为系统函数调用
[root@hadoop-master sh_func_test]# date_test.sh zxd
zxd_log_1729586975
(二)常用的函数
1.basename [string/pathname] [suffix]
功能:会删掉所有前缀及最后一个 / 字符,然后将字符串显示出来,只是对之间的字符串做的切分,不管文件有没有存在
suffix 是后缀,若指定,string/pathname 中的 suffix 会被去掉
2.dirname [string/pathname] [suffix]
功能:对给定的路径文件名中,去除文件名部分,返回剩下的路径。也只是对之间的字符串做的切分,不论路径是否存在。
[root@hadoop-master sh_test]# func_test.sh
./func_test.sh
file name:func_test
path name:.
假设我想要看某文件的实际路径:
- 获得文件所在路径的值,cd进去
- pwd得到绝对路径
- 用命令替换的方式,调用函数
[root@hadoop-master sh_test]# func_test.sh
./func_test.sh
file name:func_test
path name:/root/sh_test
二、自定义函数
(一)语法
function funname[()]
{
action
[return int;] #可有可无
}
1.形参无需定义,内部的$1...就是传入的参数
2.必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一 样先编译。
3.函数返回值只能通过 $? 系统变量获得,可以显示加:return 返回,如果不加,将 以最后一条命令运行结果,作为返回值。return 后跟整数(0-255)
(二)脚本例子
问题:
- 外部的$sum*$sum漏括号
- 由于return只有0-255,如何获取函数的返回值?
可以函数内使用echo打印一下,然后在外部用$()就能接受结果了
三、函数实际案例
举一个实际中很有用的例子
需求:实现对指定目录归档备份的脚本,当输入一个目录名称(末尾不带/), 将目录下所有文件归档保存,并将归档日期附加在归档文件名上,放在/mydir/myarchive目录下。
#!/bin/bash
#1、归档目录只能一个输入,因此先判断参数个数
if [ $# -ne 1 ]
then
echo "参数个数错误,请输入1个参数"
exit
fi
#2、参数正确时,获取目录名称
if [ -d $1 ] # 存在并且是路径
then
echo
else
echo "directory doesn't exist!"
exit
fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1);pwd) # 执行的目录可能与传入的路径不一致,因此使用绝对路径
echo $DIR_PATH
#3、归档文件名称,获取当前日期
DATE=$(date +%y%m%d)
#4、定义生成的归档文件名
FILE=archive_${DIR_NAME}_$DATE.tar.gz
FILE_NAME=/mydir/myarchive/$FILE
#5、开始归档目录文件
echo "开始备份"
tar -czf $FILE_NAME $DIR_PATH/$DIR_NAME
#6、判断是否执行成功
if [ $? -eq 0 ]
then
echo "归档成功,文件名为:$FILE_NAME"
else
echo "执行出问题"
fi
exit
过程中的报错:
- DIR_PATH获取绝对路径时少了$()
- date函数后方的%y%m%前面不能与"+"号有空格,而date与"+"号之间应该有空格
[root@hadoop-master daily_archive_func]# date +%y%m%d
241023
#"date+%y%m%d"会被认为是一条命令
[root@hadoop-master daily_archive_func]# date+%y%m%d
-bash: date+%y%m%d: 未找到命令
#会被认为多了一个参数
[root@hadoop-master daily_archive_func]# date + %y%m%d
date: 额外的操作数 "%y%m%d"
Try 'date --help' for more information.
执行结果:
[root@hadoop-master daily_archive_func]# daily_archive_func.sh a
directory doesn't exist!
[root@hadoop-master daily_archive_func]# daily_archive_func.sh 1 2
参数个数错误,请输入1个参数
[root@hadoop-master daily_archive_func]# daily_archive_func.sh /mydir/myarchive
/mydir
开始备份
tar: 从成员名中删除开头的“/”
归档成功,文件名为:/mydir/myarchive/archive_myarchive_241023.tar.gz
此外,可以使用 crontab 定时运行该脚本,定时归档