4.shell函数

news2024/12/27 13:05:55

文章目录

  • shell函数
    • shell函数的作用
    • 函数返回值
    • 函数传参
    • 函数变量作用范围
    • 递归
      • 阶乘
      • 使用函数递归目录/var/log,如果是文件直接输出文件名,如果是目录则输出目录名且输出此目录下的所有目录和文件名
      • 通过脚本输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件
      • 将IP地址转换成二进制
      • 函数库

shell函数

shell函数的作用

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

shell函数两种定义方法

  1. 方法一
function 函数名 {         ##函数名的唯一限制是不要与系统变量冲突
		命令
}
  1. 方法二
函数名() {
		命令
}

函数返回值

两种获取函数返回值的方法:

  • 方法一:return
  1. return表示退出函数并返回一个退出值,脚本中可以用 $? 变量显示该值
  2. 使用原则:
  3. 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
  4. 退出状态码必须是0~255,超出时值将为除以256取余
  • 方法二:在函数中使用echo
  1. 在函数中不使用return,在函数外获取函数的执行结果,用一个变量获取这个值,最后获取变量的值
##定义函数
function test1 {             ##函数名的唯一限制是不要与系统变量冲突
   read -p "输入一个数:" a

   return $[$a * 2]      ##返回值为 0-255 之间  超过部分 /256取余数
}


##### main #####
test1                  ##调用函数
echo $?

在这里插入图片描述

db1 () {
	read -p "请输入一个数:" a
	echo $a
}
##### main #####
result=`db1`    ##或  $(函数名)      result=$(db1)
echo $result

在这里插入图片描述

函数传参

sum1(){
  sum=$[$1+$2]       ##这个是调用函数时的位置参数
  echo $sum
}
read -p "第一个数" a
read -p "第二个数" b
sum1 $a $b
##在调用函数时,后面加上位置参数

在这里插入图片描述

sum1(){
  sum=$[$1-$2]   ##调用函数时的位置参数
  echo $sum
  echo "在函数内,\$#表示函数后面有$#个参数"
  echo "在函数内,\$@表示函数后面全部参数为 $@"
  echo "在函数内,\$0表示$0"
}
sum1 $2 $1   ##调用脚本时的位置参数
echo "在函数外,\$#表示脚本后面有$#个参数"
echo "在函数外,\$@表示脚本后面全部参数为 $@"
echo "在函数外,\$0表示$0"

在这里插入图片描述

函数变量作用范围

  • 函数只能在shell脚本中仅在当前shell环境有效,使用source执行脚本,也会影响系统当前shell环境
  • Shell脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令
test(){
  echo $name
  name=1   
  echo $name
}
name=2
test
echo $name

在这里插入图片描述

test(){
  echo $name
  local name=1    ##local  使参数只在函数内有效
  echo $name
}
name=2
test
echo $name

在这里插入图片描述

递归

函数调用自己本身的函数

阶乘

#!/bin/bash
#使用函数的递归实现阶乘

fact() {
  if [ $1 -eq 1 ];then
    echo 1
  elif [ $1 -gt 1 ];then
    local tmp=$[$1 - 1]
    local res=$(fact $tmp)
    echo $[$1 * res]
  else
    echo "输入的值无效。请输入大于等于1的整数!"
  fi
}

#####main#####

read -p "请输入一个大于等于1的整数:" num
res=$(fact $num)
echo "$num的阶乘值为$res"

在这里插入图片描述

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

#!/bin/bash

list() {
	for f in $(ls $1)
	do
		if [ -d "$1/$f" ];then
			echo "$2目录$f"
			list "$1/$f" "  $2"
		else
			echo "$2文件$f"
		fi
	done
}

list "/var/log" ""

在这里插入图片描述

通过脚本输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件

#!/bin/bash

##定义一个遍历PATH环境变量的函数
list() {
	IFSB=$IFS
	IFS=$IFS':'
	for i in $PATH
	do
		echo $i
	done
	IFS=$IFSB
}


##定义一个递归函数
listf() {
	for f in $(ls $1)
	do
		if [ -d "$1/$f" ];then
			echo "$2$f"
			listf "$1/$f" "  $2"
		else
			if [ ! -x "$1/$f" ];then
				echo "$2$f"
			fi
		fi
	done
}



#####main#####
folder=$(list)
for path in $folder
do
	echo $path
	listf "$path" "  "
done

在这里插入图片描述

将IP地址转换成二进制

#!/bin/bash

##定义一个将十进制转换成二进制的函数
switch_bin() {
	NUM=$1
	for i in {1..8}
	do
		SUM=$[NUM % 2]$SUM
		let NUM/=2
	done
	echo $SUM
}


##定义一个用于分割IP的函数
SPT() {
	IP=$1
	for i in {1..4}
	do
		num=${IP%%.*}
		IP=${IP#*.}
		BIN=$(switch_bin num)
		echo -n $BIN.
	done
}


#####mian#####
read -p "请输入一个合法的IP:" INIP
res=$(SPT $INIP)
echo ${res%.*}

在这里插入图片描述

函数库

随便定义一个文件,在文件中写好函数,当脚本文件需要时,只需要调用文件中的函数

###函数库文件

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

jianfa() {
    echo $[$1 -$2]
}

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

chufa() {
   if [ $2 -eq 0 ];then
       echo "除数不可为0"
   else
       echo $[$1 / $2]
   fi
}

fact() {
  if [ $1 -eq 1 ];then
    echo 1
  elif [ $1 -gt 1 ];then
    local tmp=$[$1 - 1]
    local res=$(fact $tmp)
    echo $[$1 * res]
  else
    echo "输入的值无效。请输入大于等于1的整数!"
  fi
}

随便写一个脚本文件,调用函数库文档

##脚本文件调用函数库

#!/bin/bsah


##加载函数库文档到当前脚本的shell
. /opt/jisuan

value1=10
value2=5

res1=$(jiafa $value1 $value2)
res2=$(jianfa $value1 $value2)
res3=$(chengfa $value1 $value2)
res4=$(fact $value1 $value2)

echo "加法和为:" $res1
echo "减法为:" $res2
echo "乘法为:" $res3
echo "阶乘为:" $res4

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python的小技巧

python的小方法 (1)利用dir()这个函数方法,知道库里面的方法有些什么。(2) 利用type()这个函数方法,知道是什么类型的数据(3)从序列元素中获取元素[1]单个星号还可以在列表/元组/字典…

纯干货!蓝牙耳机哪个牌子好?性价比高蓝牙耳机推荐

蓝牙耳机是我们使用最多的数码产品之一,不论是通勤、运动、上课都少不了它。身为数码测评专员,我每天都会进行测评,对各类数码产品也有深入研究,近期很多网友咨询蓝牙耳机哪个牌子好,于是我进行深入测评后整理了这份性…

【刷题】141. 环形链表

141. 环形链表 一、题目描述二、示例三、实现思考总结 141. 环形链表 一、题目描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环…

基于jdk11从源码角度剖析AQS 抽象同步其的核心原理

在高并发的情况下,使用基于CAS自旋实现的轻量级锁存在恶性空自旋浪费CPU 资源和导致“总线风暴”两大问题, 解决CAS恶性空自旋的有效方法是空间换时间,常见解决方法有分散操作热点和使用队列削峰。JUC并发包使用的是队列削峰的方案解决CAS的性…

YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

目录 一、EfficientNet骨干网络1、EfficientNet架构2、EfficientNet在目标检测中的应用3、EfficientNet分辨率的缩放4、EfficientNet深度与宽度的缩放 二、YOLOv7结构1、YOLOv7网络架构2、YOLOv7骨干网络3、YOLOv7使用了EfficientNet作为骨干网络,具有以下几个优点&…

如何基于异步消息队列进行深度学习模型推理预测?distributed inference with pytorch celery huey sqlite

文章目录 celery 简介celery in pytorchwindows 平台下使用celery 的一些问题参考文献与学习路径一些类似消息队列多进行推理预测的实现参考celery and sqlitecelery vs hueycelery 简介 先说一下celery 不支持windows 【或者说支持的不好】 pypi https://pypi.org/project/…

docker-安装prometheus

概述 什么是Prometheus 如果对Prometheus不熟悉的, 可以先了解一下Prometheus的官网或者文档; Prometheus是一个开源的系统监控和报警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中&…

基于java和go-cqhttp实现QQ机器人

目录 yh-qqrobot机器人简介go-cqhttp搭建1.下载应用2.生成bat文件3. 初始化项目4. 配置5. 运行项目 yh-qqrobot搭建搭建后端1. 导入sql文件2. 配置文件3. 导入到idea 搭建前端 yh-qqrobot机器人简介 yh-qqrobot是一个基于若依框和go-cqhttp集成的系统,一开始我只是揣…

ACM 1010 | 利润计算

文章目录 0x00 前言 0x01 题目描述 0x02 问题分析 0x03 代码设计 0x04 完整代码 0x05 运行效果 0x06 总结 0x00 前言 C 语言网不仅提供 C 语言,还包括 C 、 java 、算法与数据结构等课程在内的各种入门教程、视频录像、编程经验、编译器教程及软件下载、题解博…

day2_内存区域2垃圾回收算法

文章目录 方法区1.StringTable2.StringTable的位置3.StringTable的调优 垃圾回收1. 判断垃圾2. 5种引用3. 垃圾回收算法 方法区 前面提到了方法区中的组成,它的组成主要是: class(例如它的属性,方法等)常量池(StringTable等)类加载器 在jdk 1.8中&…

【python学习】基础篇-文件与系统-文件信息获取与目录操作

python内置文件高级操作函数 删除文件 Python 没有内置删除文件的函数,但是在内置的 os 模块中提供了删除文件的 remove()函数,语法格式如下: os.remove(path) 其中,path 为要删除的文件路径,可以使用相对路径,也可以…

P1058 [NOIP2008 普及组] 立体图

题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。 小渊有一块面积为 ��mn 的矩形区域,上面有 �&#x…

number类型超出16位的问题(前端、后端处理)

目录 1、前端解决方案 1.1 甩链接 1.2 接口返回数据过程中将数据处理为字符串(过过嘴瘾) 1.3 对返回的json字符串进行数据预处理代码如下 2、后端解决方案 2.1 toString、String、 、new String() 自己悟、就是要改的地方多。 2.2拦截器 (可能超出…

为什么越来越多的企业选择云计算?

一、前言 1.当下企业信息化的痛点 企业信息化,这也算是一个老生常谈的话题了,整个中国业内前前后后应该喊了有十多年了。不过到目前为止,我国很多企业公司都还没真正形成一个完整的信息化框架,或者只是运用了一个简单财务或客户…

Vue3组件通信 含有详细的步骤和解释

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、父传子 defineProps1.使用运行时声明2.使用针对类型的声明 二、子传父 defineEmits1.使用运行时声明2.使用针对类型的声明 总结 前言 Vue2的父子组件通信是…

PMP课堂模拟题目及解析(第4期)

31. 首席执行官要求项目经理提供绩效报告。项目经理应该在这份报告中包含哪些内容? A. 已完成百分比和经验教训 B. 问题的当前状态以及更新后的干系人参与评估矩阵 C. 项目风险的绩效测量指标 D. 已完成的工作和关键绩效指标 32. 在一个项目的最终收尾活动期…

九联UNT413A-S905L3A-免拆U盘卡刷固件包-当贝纯净桌面-内有教程

九联UNT413A-S905L3A-免拆U盘卡刷固件包-当贝纯净桌面-内有教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件&#…

迪赛智慧数——饼图(玫瑰饼图):菜品味道受欢迎程度

效果图 大家最爱吃的竟是它!咸鲜占比高达23.53%! 民以食为天,你最喜欢的美食口味是什么呢? 好吃的太多,你应该很难确切地评出你心中的第一名吧。据数据调查显示,咸鲜口味最受欢迎,其次是麻辣、…

SUNTANS模型学习(9)——学习Tidal forcing算例

学习Tidal forcing算例 简介网格配置与地形定解条件设置初始条件设置边界条件设置开边界处的通量计算(OpenBoundaryFluxes)开边处的速度、水位(BoundaryVelocities) 其它参数配置模拟结果 简介 SUNTANS中 tidal forcing 算例的全…

数据脱敏的几种方案

文章目录 什么是数据脱敏?数据脱敏在生活中的应用静态脱敏与动态脱敏数据脱敏的几种方案sql数据脱敏java代码实现脱敏mybatis-mate实现脱敏springCloud网关拦截响应体实现脱敏openGauss 动态数据脱敏解决方案 什么是数据脱敏? 数据脱敏也叫数据的去隐私…