4.shell函数

文章目录

  • 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

在这里插入图片描述

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

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

相关文章

【Jmeter快速入门】

Jmeter快速入门 Jmeter快速入门1.安装Jmeter1.1.下载1.2.解压1.3.运行 2.快速入门2.1.设置中文语言2.2.基本用法 Jmeter快速入门 1.安装Jmeter Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量。 1.1.下载 可以Apache Jm…

SSM整合详细教学(上)

SSM整合详细教学(上) 一、SSM整合1. SSM整合配置1.1 SSM整合流程1.2 SSM整合配置1.2.1 创建工程,添加依赖和插件1.2.2 Spring整合Mybatis1.2.3 Spring整合SpringMVC 2. 功能模块开发2.1 数据层开发(BookDao)2.2 业务层开发(BookService/BookS…

TIM编码器接口

一、知识点 1、Encoder Interface 编码器接口的工作流程 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度 2、编码器接口…

「领域驱动设计」DDD,六边形架构,洋葱架构,整洁架构和CQRS的整合

这篇文章是软件架构编年史的一部分,一系列关于软件架构的文章。在这些文章中,我写了我对软件架构的了解,我如何看待它,以及我如何使用这些知识。如果您阅读了本系列以前的文章,那么本文的内容可能更有意义。 今天的帖子…

【多任务学习】Multi-task Learning 手把手编码带数据集, 一文吃透多任务学习

文章目录 前言1.多任务学习1.1 定义1.2 原理 2. 多任务学习code2.1 数据集初探2.2 预处理2.3 网络结构2.4 训练 3. 总结 前言 我们之前讲过的模型通常聚焦单个任务,比如预测图片的类别等,在训练的时候,我们会关注某一个特定指标的优化. 但是有时候,我们需要知道一个图片,从它身…

PostgreSQL 基础知识:psql 提示和技巧

对于积极使用和连接到 PostgreSQL 数据库的任何开发人员或 DBA 来说,能够访问psql命令行工具是必不可少的。在我们的第一篇文章中,我们讨论了 psql的简要历史,并演示了如何在您选择的平台上安装它并连接到 PostgreSQL 数据库。 在本文中&…

HTTPS协议介绍

文章目录 一、HTTPS协议的认识二、常见的加密方式1.对称加密2.非对称加密 三、数据摘要四、HTTPS的工作过程探究1.只使用对称加密2.只使用非对称加密3.双方都使用非对称加密4.非对称加密对称加密5.中间人攻击6.引入证书7.非对称加密对称加密证书认证 一、HTTPS协议的认识 HTTP…

HTTP的method方法 GET POST PUT DELETE HEAD OPTIONS CONNECT PATCH TRACE

HTTP的method方法 GET POST PUT DELETE HEAD OPTIONS CONNECT PATCH TRACE GET 向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意…

Docker 持久化存储 Bind mounts

Docker 持久化存储 Bind mounts Bind mounts 的 -v 与 --mount 区别启动容器基于bind mount挂载到容器中的非空目录只读 bind mountcompose 中使用 bind mount 官方文档:https://docs.docker.com/storage/bind-mounts/ Bind mounts 的 -v 与 --mount 区别 如果使用…

ePWM模块(1)

ePWM模块 ePWM模块内部包含有7个子模块,分别是时间基准子模块TB、比较功能子模块CC,动作限定子模块AQ、死区控制子模块DB、斩波控制子模块PC、事件触发子模块ET和故障捕获子模块TZ。 每个ePWM模块都具有以下功能: 可以输出两路PWM,EPWMxA和EPWMxB两路PWM可以独立输出,也可…

大二一个学期学这么点内容,没有概念,只有实操

如何查看所有的数据库: Show databases; 如何进入某个数据库: use xxx; 如何新进数据库: Create database jx; 如何删除数据库: Drop database jx; 如何查看所有的表格: Show tables; 如何创建数据表&#xf…

【Flink】DataStream API使用之执行环境

1. 执行环境 Flink 程序可以在各种上下文环境中运行:我们可以在本地 JVM 中执行程序,也可以提交 到远程集群上运行。不同的环境,代码的提交运行的过程会有所不同。这就要求我们在提交作业执行计算时,首先必须获取当前 Flink 的运…

(异或相消)猫猫数字异或和

E - Red Scarf (atcoder.jp) 刚入坑写的一道题被我拉出来对比分析了 我的思路: 垃圾运气选手凭借直觉乱搞猜出来的,没有思路。 题解思路: 由问题陈述中XOR的定义,我们可以看出计算3个或更多整数的XOR可以以任意顺序进行&#…

ChatGPT :十几个国内免费可用 ChatGPT 网页版

前言 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言…

树脂塞孔有哪些优缺点及应用?

树脂塞孔的概述 树脂塞孔就是利用导电或者非导电树脂,通过印刷,利用一切可能的方式,在机械通孔、机械盲埋孔等各种类型的孔内进行填充,实现塞孔的目的。 树脂塞孔的目的 1 树脂填充各种盲埋孔之后,利于层压的真空下…

盲目自学网络安全只会成为脚本小子?

前言:我们来看看怎么学才不会成为脚本小子 目录: 一,怎么入门? 1、Web 安全相关概念(2 周)2、熟悉渗透相关工具(3 周)3、渗透实战操作(5 周)4、关注安全圈动…

2.RabbitMQ

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应&am…

springboot整合flowable工作流引擎的简单使用

内容来自网络整理,文章最下有引用地址,可跳转至相关资源页面。若有侵权请联系删除 环境: mysql5.7.2 springboot 2.3.9.RELEASE flowable 6.7.2 采坑: 1.当前flowable sql需要与引用的pom依赖一致,否则会报library…

进程/线程 状态模型详解

前言:最近操作系统复习到线程的状态模型(也可以说进程的状态模型,本文直接用线程来说)时候,网上查阅资料,发现很多文章都说的很不一样,有五状态模型、六状态模型、七状态模型.......虽然都是对的…

[Python]爬虫基础——urllib库

urllib目录 一、简介二、发送请求1、urlopen()函数2、Request()函数 三、异常处理四、解析URL五、分析Robots协议 一、简介 urllib库是Python内置的标准库。包含以下四个模块: 1、request:模拟发送HTTP请求; 2、error:处理HTTP请…