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

shell脚本----函数

文章目录

  • 一、函数的定义
    • 1.1 shell函数:
    • 1.2函数如何定义
  • 二、函数的返回值
  • 三、函数的传参
  • 四、函数变量的作用范围
  • 五、函数的递归
  • 六、函数库

一、函数的定义

1.1 shell函数:

  • 使用函数可以避免代码重复
  • 使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强

1.2函数如何定义

法一:
[function] 函数名 (){命令序列[return x]              
}法二:
函数名(){命令序列
}

二、函数的返回值

1、在函数内用return退出函数并返回函数的值,在函数外用echo $?获取返回值,注:返回值的范围只能在0~255,超过部分需除以256取余

编写一个脚本查看他的返回数
在这里插入图片描述

执行脚本

在这里插入图片描述
可以看出$?的返回值是有上限的,返回值的范围只能在0~255,超过部分需除以256取余

2、在函数内用echo输出值,在函数体外可用变量=$(函数名)获取函数的返回值

编写一个脚本

在这里插入图片描述

执行脚本

在这里插入图片描述

可以看出相较于$?没有取值的范围。

三、函数的传参

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。

示例:

在这里插入图片描述

结果:

在这里插入图片描述

示例:

在这里插入图片描述

结果:

在这里插入图片描述

在这里插入图片描述

函数体内部的$1 $2代表的是调用函数时,函数后面跟的位置参数
函数体外的$1 $2代表的是执行脚本时,脚本后面跟的位置参数

在这里插入图片描述

在函数体内部的$#代表调用函数时,函数后面跟的参数个数
在函数体内部的$@ $*代表调用函数时,函数后面跟的所有参数
在函数体外时,$#代表脚本后面跟的参数个数
在函数体外时,$@ $*代表脚本后面跟的所有参数

四、函数变量的作用范围

1、函数在Shell脚本中仅在当前脚本Shell环境中有效(使用source/. 执行脚本,也会影响系统的当前Shell环境)
2、Shell脚本中变量默认全局有效
3、将变量限定在函数内部使用local命令
4、系统Shell环境>>脚本Shell环境>>函数Shell环境

示例一:

[root@localhost ~]# vim test5.sh
#!/bin/bash
myfun () {echo $namename=fengchuecho $name
}
name=wolong
myfun
echo $name
[root@localhost ~]# sh test5.sh
wolong
fengchu
fengchu

在这里插入图片描述

实例二:

[root@localhost ~]# vim test5.sh
#!/bin/bash
myfun () {echo $namelocal name=fengchuecho $name
}
name=wolong
myfun
echo $name
[root@localhost ~]# sh test5.sh
wolong
fengchu
wolong

在这里插入图片描述

五、函数的递归

递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。所以递归要有两个基本要素,结束条件与递推关系。

递归的两个基本要素:
    1.边界条件:确定递归到何时结束,也被称为递归的出口
    2.递归所使用的模式:大问题分解成小问题。递归函数只有具有上述两个条件,才能计算出结果。

示例一:求阶乘

#!/bin/bash
fact() {
if [ $1 -eq 1 ]
thenecho 1
elselocal temp=$[$1-1]local res=$(fact $temp)echo $[$1 * $res]
fi
}
read -p "请输入一个数:" n
res=$(fact $n)
echo $res
[root@localhost opt]# sh digui.sh
请输入一个数:5
120
[root@localhost opt]# sh digui.sh
请输入一个数:6
720

在这里插入图片描述

在这里插入图片描述

示例二:使用递归查询目录
使用函数递归目录/var/log,如果是文件直接输出文件名,如果是目录则输出目录名且输出此目录下的所有目录和文件名

[root@localhost opt]# vim digui2.sh
#!/bin/bash
list () {
for f in $(ls $1)
doif [ -d "$1/$f" ]thenecho "$2这是目录$f"list "$1/$f" " $2"elseecho "$2这是文件$f"fi
done
}
list "/opt" " "
[root@localhost opt]# sh digui2.sh这是目录aa这是目录bb这是目录cc这是目录dd这是文件123.txt这是文件digui2.sh这是文件digui.sh这是目录rh这是文件test2.sh这是文件test3.sh这是文件test4.sh这是文件test.sh

在这里插入图片描述

在这里插入图片描述

六、函数库

如果我们能拥有,或者编写过很多有价值的函数(能够具体实现某一功能的那种函数),我们在想运用的时候希望能够跨文件调用,这些在Linux中shell脚本也能实现,只要进行函数库文件的搭建,后期就能在编写脚本时进行直接调用

  • 函数库所存文件为普通文件即可,但是函数的格式一定要规范,有能传参的设置。

  • 后面进行调用时可以通过 “.”和“source”来进行跨文件调用

创建一个函数库

[root@localhost opt]# vim ku.sh
#!/bin/bash
jiafa(){echo $[$1 + $2]
}jianfa(){echo $[$1 - $2]
}chengfa(){echo $[$1 * $2]
}chufa(){if [ $2 -eq 0 ]thenecho "除数不可为0"elseecho $[$1 / $2]fi
}fact(){if [ $1 -eq 1 ];thenecho 1elif [ $1 -gt 1 ]thenlocal tmp=$[$1 - 1]local res=$(fact $tmp)echo $[$1 * res]elseecho "输入的值无效,请输入大于等于1的整数!"fi
}

在这里插入图片描述

在其他的shell脚本中执行函数


[root@localhost opt]# vim test6.sh
#!/bin/bash
. /opt/ku.shread -p "请输入一个正整数:" num1
read -p "请输入二个正整数:" num2res1=$(jiafa $num1 $num2)
res2=$(jianfa $num1 $num2)
res3=$(chengfa $num1 $num2)
res4=$(chufa $num1 $num2)
res5=$(fact $num1 $num2)echo "加法的结果为:$res1"
echo "减法的结果为:$res2"
echo "乘法的结果为:$res3"
echo "除法的结果为:$res4"
echo "阶乘的结果为:$res5"
[root@localhost opt]# sh test6.sh
请输入一个正整数:5
请输入二个正整数:2
加法的结果为:7
减法的结果为:3
乘法的结果为:10
除法的结果为:2
阶乘的结果为:120

在这里插入图片描述

在这里插入图片描述

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

相关文章:

  • ( 位运算 ) 693. 交替位二进制数 ——【Leetcode每日一题】
  • http简述
  • 一顿饭的事儿,搞懂了Linux5种IO模型
  • C#面向对象的概念
  • 探索学习和入门使用GitHub Copilot:提升代码开发的新利器
  • 在字节跳动做了6年软件测试,4月无情被辞,想给划水的兄弟提个醒
  • 常见信号质量问题、危害及其解决方法-信号完整性-过冲、噪声、回勾、边沿缓慢
  • Java 自定义注解及使用
  • ChatGPT的强化学习部分介绍——PPO算法实战LunarLander-v2
  • JavaWeb ( 八 ) 过滤器与监听器
  • Notion Ai中文指令使用技巧
  • Linux一学就会——编写自己的shell
  • 编程练习【有效的括号】
  • Android 音频开发——桌面小部件(七)
  • 常见的C++包管理
  • 基于yolov7开发构建学生课堂行为检测识别系统
  • GPT-4 开始内测32k输入长度的版本了!你收到邀请了吗?
  • 如何用ChatGPT做新品上市推广方案策划?
  • Qt之QGraphicsEffect的简单使用(含源码+注释)
  • 前端优化-css
  • 第三方ipad笔哪个牌子好用?ipad触控笔推荐平价
  • windows10+detectron2完美安装教程
  • 串口与wifi模块
  • 上财黄烨:金融科技人才的吸引与培养
  • 利用MQ事务消息实现分布式事务
  • C++面向对象设计:深入理解多态与抽象类实现技巧
  • 长三角生物医药产业加速跑,飞桨螺旋桨为创新药企、医药技术伙伴装上AI大模型引擎...
  • orin Ubuntu 20.04 配置 Realsense-ROS
  • MyBatis基础知识点总结
  • 校园企业车辆维修报修管理系统设计与开发