【Shell】Shell编程之函数

目录

1.Shell函数定义

2.Shell函数的作用

3.函数返回值

4.函数传参

5.函数变量的作用范围

案例


1.Shell函数定义

格式1

function 函数名 {
    命令序列
}

格式2

函数名() {
    命令序列
}

2.Shell函数的作用

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

PS:看一个人编的脚本多不多规不规范熟不熟练,就看他编写的脚本有没有大量用函数,如果脚本里全是代码没有函数就知道这个人一定是个小白。


3.函数返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为除以256取余

function db1 {
  read -p "请输入:" value
  return $[$value * 2]
}
db1
echo $?

db1() {
  read -p "请输入:" value
  echo $[$value * 2]
}
result=`db1`
echo $result


4.函数传参:

sum1() {
    sum=$[$1 + $2]
    echo $sum
}
read -p "输入第一个参数:" first
read -p "输入第二个参数:" second
sum1 $first $second

sum2() {
    sum=$[$1 + $2]
    echo $sum
}
sum2 $1 $2

5.函数变量的作用范围:

函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令

#!/bin/bash
#输出9,因为i的值被覆盖了

i=8
i=9
echo $i
#!/bin/bash
#输出8,主函数开始运行,第一步函数调用i=9,然后i=8覆盖后输出
 
myfun() {
    i=9
}
########## main ###########
myfun
i=8
echo $i

 

案例

使用函数 输出菱形,并实现可通过输入数值的大小来伸缩菱形的大小

myfun() {
local i
i=8
echo $i
}
i=9
myfun
echo $i


递归
函数调用自己本身的函数

#!/bin/bash
#使用递归计算阶乘
 
fact() {
        if [ $1 -eq 1 ]
        #$1,表示函数后面调用的变量,如果调用的值是1,输出值就是1
        then
                echo 1
        else
                local temp=$[$1-1]
                #定义一个变量temp为传入函数的参数减1,并且为局部变量
                local result=$(fact $temp)
                #每次调用函数自己,每次temp减1,直到为1
                echo $[$1 * $result]
        fi
}
 
##### main #####
read -p "请输入一个正整数:" num
result=$(fact $num)
#跟上面的result不影响,上面的result是局部变量,仅在函数内有效
echo "$num 的阶乘为: $result"
 
 
########实现过程
 
fact 5
 
$1=5   temp=4   result=$(fact 4)   echo 5 * $(fact 4)
$1=4   temp=3   result=$(fact 3)   echo 5 * 4*$(fact 3)
$1=3   temp=2   result=$(fact 2)   echo 5 * 4 * 3*$(fact 2)
$1=2   temp=1   result=$(fact 1)   echo 5 * 4 * 3 * 2*$(fact 1)
$1=1                                                2*1

 

#递归目录
function list_files {
for f in `ls $1`
do
   if [ -d "$1/$f" ]
   then
      echo "$2$f"
      list_files "$1/$f" " $2"
   else
       echo "$2$f"
   fi
done
}

list_files "/var/log" ""

创建库

可以事先创建一个函数库,在里面定义各种常用的函数然后可以在别的shell脚本中直接引用

vim myfuncs.sh


jiafa() {
  echo $[$1 + $2]
}

chengfa() {
  echo $[$1 * $2]
}

chufa() {
  if [ $2 -ne 0 ];then
    echo $[$1 / $2]
  else
    echo "$2不能为0"
  fi
}


vim test.sh
. myfuncs.sh

value1=10
value2=5
result1=`jiafa $value1 $value2`
result2=`chengfa $value1 $value2`
result3=`chufa $value1 $value2`
echo "加法结果为:$result1"
echo "乘法结果为:$result2"
echo "除法结果为:$result3"

vim function.sh
servicectl_usage() {
   echo "Usage:servicectl <service-name> <start|stop|restart|reload|status>"
   return 1
}

chk_centos_ver() {
   grep "CentOS.*release 7." /etc/centos-release &> /dev/null && echo "7"
   grep "CentOS.*release 6." /etc/centos-release &> /dev/null && echo "6"
   grep "CentOS.*release 5." /etc/centos-release &> /dev/null && echo "5"
}

servicectl() {
   [[ -z $1 || -z $2 ]] && servicectl_usage
   [ $(chk_centos_ver) == "7" ] && systemctl $2 ${1}.service || service $1 $2
}

servicectl $1 $2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/625939.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springcloud简单了解及上手

springcloud微服务框架简单上手 文章目录 springcloud微服务框架简单上手一、SpringCloud简单介绍1.1 单体架构1.2 分布式架构1.3 微服务 二、SpringCloud与SpringBoot的版本对应关系2022.x 分支2021.x 分支2.2.x 分支 三、Nacos注册中心3.1 认识和安装Nacos3.2 配置Nacos3.3 n…

【ARM Cortex-M 系列 2.3 -- Cortex-M7 Debug event 详细介绍】

请阅读【嵌入式开发学习必备专栏】 文章目录 Cortex-M7 Debug eventDebug events Cortex-M7 Debug event 在ARM Cortex-M7架构中&#xff0c;调试事件&#xff08;Debug Event&#xff09;是由于调试原因而触发的事件。一个调试事件会导致以下几种情况之一发生&#xff1a; 进…

部署管理征信链码

一 . 链码准备 需要删除上面后面标记的文件&#xff0c;之后拖入 二. 打包链码 注意需要先启动链 打包测试链码 export FABRIC_CFG_PATH${PWD}/config peer lifecycle chaincode package ./chaincode/chaincode_basic.tar.gz --path ./chaincode/credit_chaincode --lang n…

vue3.0(五) reactive全家桶

文章目录 1 reactive1.1 reactive的应用1.2 reactive的特点1.3 reactive的注意1.4 reactive的局限性 2 toRefs3 isReactive4 shallowReactive5 readonly5.1 readonly 详细信息5.2 readonly函数创建一个只读的响应式对象5.3 如何修改嵌套在只读响应式对象中的对象? 6 isReadonl…

考研数学|李林《880》做不动,怎么办!?看这一篇!

在考研数学的备考过程中&#xff0c;遇到难题是很常见的情况&#xff0c;尤其是当你尝试解决李林880习题集中的问题时。他以其难度和深度著称&#xff0c;旨在帮助考生深入理解数学分析的复杂概念。 如果你在解题过程中感到困难&#xff0c;这并不是你个人的问题&#xff0c;而…

《无畏契约》游戏画面出现“撕裂感“,你清楚背后的原理吗?

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

安全风险 - 如何解决 setAccessible(true) 带来的安全风险?

可能每款成熟的金融app上架前都会经过层层安全检测才能执行上架&#xff0c;所以我隔三差五就能看到安全检测报告中提到的问题&#xff0c;根据问题的不同级别&#xff0c;处理的优先级也有所不同&#xff0c;此次讲的主要是一个 “轻度问题” &#xff0c;个人认为属于那种可改…

[译文] 恶意代码分析:2.LNK文件伪装成证书传播RokRAT恶意软件(含无文件攻击)

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…

idea控制台日志控制

1.清除控制台log日志 测试的时候&#xff0c;控制台打印的日志比较多&#xff0c;速度有点慢而且不利于查看运行结果&#xff0c;所以接下来我们把这个日志处理下: 取消初始化spring日志打印&#xff0c;resources目录下添加logback.xml&#xff0c;名称固定&#xff0c;内容如…

Transformer+Classification学习笔记

论文名称&#xff1a;An Image is Worth 16x16 Words:Transformers for Image Recognition at Scale [2112.11010] MPViT: Multi-Path Vision Transformer for Dense Prediction (arxiv.org) 参考博客与视频&#xff1a; Vision Transformer 超详细解读 (原理分析代码解读) …

[动画详解]LeetCode151.翻转字符串里的单词

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解LeetCode算法系列 用通俗易懂的动画让算法题不再神秘 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成…

589.N叉树的前序遍历

刷算法题&#xff1a; 第一遍&#xff1a;1.看5分钟&#xff0c;没思路看题解 2.通过题解改进自己的解法&#xff0c;并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步&#xff0c;下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

解决el-upload组件上传文件403 Forbidden的问题

话不多说&#xff0c;上错误。网络显示&#xff1a; 控制台显示&#xff1a; 并且后端也没接收到任何的请求。 只需要把前端中的组件&#xff1a; action的路径修改为&#xff1a; 也就是不写前面的localhost&#xff0c;而是拼接上发送请求拼接的‘api’即可 可以看到&#x…

架构每日一学 6:作为架构师,你必须学会寻找商业模式

本文首发于公众平台&#xff1a;腐烂的橘子 在前面的文章中&#xff0c;我们已经讲了架构师的两条生存法则&#xff0c;第一条是有且仅有一个目标&#xff0c;感兴趣的可以看一下原文&#xff1a; 架构每日一学 2&#xff1a;架构师六个生存法则之一&#xff1a;架构必须有且仅…

【LLM第五篇】名词解释:prompt

1.是什么 提示工程&#xff08;Prompt Engineering&#xff09;是一门较新的学科&#xff0c;关注提示词开发和优化&#xff0c;帮助用户将大语言模型&#xff08;Large Language Model, LLM&#xff09;用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了解…

教育型内容的制胜秘诀:Kompas.ai如何结合知识与营销

在数字化营销的浪潮中&#xff0c;教育型内容已经成为品牌建立权威性和提供价值的重要手段。通过分享专业知识和见解&#xff0c;品牌不仅能够吸引目标受众&#xff0c;还能够在潜在客户心中建立起专业和可信赖的形象。本文将深入分析教育型内容的重要性&#xff0c;详细介绍Ko…

sklearn之k近邻算法——以鸢尾花分类为例

文章目录 k近邻算法算法原理k值的选取特征数据的归一化距离的度量分类原则的制定鸢尾花分类 k近邻算法 k近邻算法是经典的监督学习算法&#xff0c;我们这里主要介绍k近邻算法的基本内容和如何应用 算法原理 k近邻算法的基本原理其实很简单 首先k近邻算法是一个分类算法&am…

x264 帧类型代价计算原理:slicetype_slice_cost 函数分析

x264 x264 是一个开源的视频编码库,它实现了H.264/AVC标准。H.264是一种广泛使用的压缩标准,用于视频流、视频下载、蓝光光盘以及许多其他形式的数字视频分发。x264 以其高压缩效率和良好的视频质量而著称,是许多视频编辑软件和视频播放器的默认编解码器。 以下是关于 x26…

软件工程期末复习(6)需求分析的任务

需求分析 需求分析的任务 “建造一个软件系统的最困难的部分是决定要建造什么……没有别的工作在做错时会如此影响最终系统&#xff0c;没有别的工作比以后矫正更困难。” —— Fred Brooks 需求难以建立的原因&#x…

半小时搞懂STM32面经知识——RCC

1. 时钟的概念 时钟是由电路产生的具有周期性的脉冲信号&#xff0c;相当于单片机的心脏&#xff0c;要想使用单片机的外设必须开启时钟。 时钟对单片机有什么作用&#xff1f; 1. 驱动外设的本质是寄存器&#xff0c;而寄存器需要时钟触发才能改写值。 2. 时钟频率越高&#…