当前位置: 首页 > news >正文

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
fiDIR_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 "执行出问题"
fiexit

过程中的报错: 

  • 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 定时运行该脚本,定时归档

http://www.lryc.cn/news/466916.html

相关文章:

  • 通过IP地址或者主机名添加打印机20241023
  • 基于SpringBoot+Vue智慧养老关爱系统【提供源码+答辩PPT+参考文档+项目部署】
  • 新手教学系列——利用短效代理快速搭建代理池
  • 实体与DTO如何转换
  • Docker 安装Postgres和PostGIS,并制作镜像
  • ES6:let和const命令解读以及变量的解构赋值
  • java-collection集合整理0.9.4
  • ParallelsDesktop20最新版本虚拟机 一键切换系统 游戏娱乐两不误
  • 现代C语言:C23标准重大更新
  • Maven进阶——坐标、依赖、仓库
  • Android中的内存泄漏及其检测方式
  • 【雷电模拟器命令合集操作大全】官方文档整理贴
  • redis的配置文件解析
  • Python中的元组和列表
  • 【AI战略思考7】粮草筹集完毕和我的朋友分类
  • 科大讯飞AI开发者大赛颁奖典礼,万码优才荣获前三甲!
  • Redis 哨兵机制
  • linux-磁盘io情况、性能排查
  • NC 单据模板自定义项 设置参照,比如部门参照、自定义参照等
  • table-cascade 使用
  • Android SELinux——策略文件配置结构(八)
  • 【数据结构与算法】队列——数据世界中的“有序使者”
  • yolov11 部署 TensorRT,预处理和后处理用 C++ cuda 加速,速度快到飞起
  • 国际期货收费行情源CTP推送式/期货配资软件开发对接行情源的技术性说明
  • 上拉电阻和下拉电阻在电路中的作用(一)
  • 怎么轻松把图片存入二维码?图片生成二维码的简单3步技巧
  • perl双引号内字符串的反斜线转义
  • 【编程语言】Kotlin快速入门 - 伴生对象与懒加载
  • 三、数据聚合和函数
  • Golang | Leetcode Golang题解之第500题键盘行