一、Shell函数概述
1. Shell函数的概念
将命令序列按格式写在一起,可方便重复使用命令序列
2. Shell函数定义
方式一:
方式二:
3. 调用函数的方法
函数名 [参数1] [参数2]
4. 函数返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
(1)函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
(2)退出状态码必须是0~255,超出时返回值将为除以256后的取余数。
5. 函数的作用范围
函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
| #!/bin/bash |
| |
| test() { |
| local i |
| i=8 |
| echo |
| } |
| i=9 |
| test |
| echo $i |
6. 函数的参数
(1)参数的用法
函数名称 参数1 参数2 参数3……
(2)参数的表示方法
$1 $2 $3 …… ${10} ${11} ……
| #!/bin/bash |
| |
| sum1() { |
| sum=$[$1+$2] |
| echo $sum |
| } |
| |
| sum1 $1 $2 |
| [root@localhost ~]# ./jiafa.sh 1 2 |
| 3 |
二、递归函数
1. 阶乘
调用自己本身的函数
| #!/bin/bash |
| |
| fact() { |
| if [ $1 -eq 1 ];then |
| echo 1 |
| else |
| local temp=$[$1 - 1] |
| local result=$(fact $temp) |
| echo $[$1 * $result] |
| fi |
| } |
| |
| read -p "请输入:" n |
| result=$(fact $n) |
| echo $result |
| [root@localhost ~]# ./fact.sh |
| 请输入一个阶乘的数字:5 |
| 120 |
| [root@localhost ~]# ./fact.sh |
| 请输入一个阶乘的数字:10 |
| 3628800 |
2. 递归目录
| #!/bin/bash |
| |
| list_files() { |
| for i in $(ls $1) |
| do |
| if [ -d "$1/$i" ];then |
| echo "$2$i/" |
| list_files "$1/$i" " $2" |
| else |
| if [ ! -x $1/$i ];then |
| echo "$2$i" |
| fi |
| fi |
| done |
| } |
| |
| |
| OLDIFS=$IFS |
| IFS=$IFS':' |
| |
| for floder in $PATH |
| do |
| echo "$floder/" |
| list_files "$floder" " " |
| done |
| |
| IFS=$OLDIFS |
| [root@localhost ~] |
| /usr/local/sbin/ |
| /usr/local/bin/ |
| /usr/sbin/ |
| /usr/bin/ |
| /root/bin/ |
| aa/ |
| bb/ |
| cc/ |
| dd/ |
| abc.txt |
三、创建函数库
1. 函数库的定义
函数库是由系统建立的具有一定功能的函数的集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息。用户也可以根据自己的需要建立自己的用户函数库。
2. 函数库的作用
C语言库函数是把自定义函数放到库里,是别人把一些常用到的函数编完放到一个文件里,供程序员使用。程序员用的时候把它所在的文件名用#include<>加到里面就可以了(尖括号内填写文件名),例如#include<math.h>。
3. 创建函数库
| #!/bin/bash |
| |
| fact() { |
| if [ $1 -eq 1 ];then |
| echo 1 |
| else |
| local temp=$[$1-1] |
| local result=$(fact $temp) |
| echo $[$1 * $result] |
| fi |
| } |
| |
| jiafa() { |
| echo $[$1 + $2] |
| } |
| |
| jianfa() { |
| echo $[$1 - $2] |
| } |
| |
| chengfa() { |
| echo $[$1 * $2] |
| } |
| |
| chufa() { |
| if [ $2 -ne 0 ];then |
| echo $[$1 / $2] |
| else |
| echo "被除数不能为0!" |
| fi |
| } |
4. 调用函数库
| #!/bin/bash |
| |
| . suanfa.sh |
| |
| v1=$1 |
| v2=$2 |
| |
| res1=$(jiafa $v1 $v2) |
| res2=$(jianfa $v1 $v2) |
| res3=$(chengfa $v1 $v2) |
| res4=$(chufa $v1 $v2) |
| res5=$(fact $v1) |
| |
| echo "加法的结果为 $res1" |
| echo "减法的结果为 $res2" |
| echo "乘法的结果为 $res3" |
| echo "除法的结果为 $res4" |
| echo "$1 阶乘的结果为 $res5" |
| [root@localhost ~] |
| 加法的结果为 15 |
| 减法的结果为 5 |
| 乘法的结果为 50 |
| 除法的结果为 2 |
| 10 阶乘的结果为 3628800 |
| [root@localhost ~] |
| 加法的结果为 5 |
| 减法的结果为 5 |
| 乘法的结果为 0 |
| 除法的结果为 被除数不能为0! |
| 5 阶乘的结果为 120 |
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现