Shell中的函数

目录

一、系统函数

(一)前言

(二)常用的函数

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)

(二)脚本例子

问题:

  1. 外部的$sum*$sum漏括号
  2. 由于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 定时运行该脚本,定时归档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带带琪宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值