33、循环语句--函数---递归+阶乘

news2025/1/22 9:08:37

一、函数

1.1、shell的函数

1.1.1、函数的定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。

for i in {}

do

  命令序列

done
if []

then 

命令序列

else

命令序列

fi     #可以作为一个命令序列

作用:方便重复使用,函数库,集中在一起,随时可以传参调用。大的过程分割成若干个小的功能模块,提高代码的可读性。

购物

展示

结算

支付

物流

1.2、函数的格式

1.2.1、函数两种格式

function 函数名 {
命令序列
}


函数名 () {
命令序列
}
function 函数名 {
命令序列
}

函数名   ##调用函数

例子:

function shoping {
read -p "输入一个" a
num=$(($a*2))
echo $num
}
shoping   

[root@test1 opt]# sh test51.sh
输入一个3
6
[root@test1 opt]# vim test51.sh

function shoping {

num=$(($a*2))
echo $num
}
a=10
shoping



[root@test1 opt]# sh test51.sh
20

在这里插入图片描述

function shoping {
read -p "输入一个数" a
num=$(($a*2))
return $num
}
shoping 
echo $?
#return 的作用:return只能写在函数的内部,目的是从函数的内部获取一个返回值
#用来判断是否执行下一个脚本。echo $? 这个时候不再是判断执行结果,只是一个函数内部的返回值。
#在使用return传回的时候,默认0是成功,非零是失败

1.2.2、echo $?作用和区别

[root@test1 opt]# vim test57.sh

abc () {
read -p "输入一个数" num
a=$(($num*2))
return $a
}
abc



[root@test1 opt]# sh test57.sh
输入一个数8
[root@test1 opt]# vim test57.sh

abc () {
read -p "输入一个数" num
a=$(($num*2))
return $a
}
abc
echo $?



[root@test1 opt]# sh test57.sh
输入一个数4
8

在这里插入图片描述

function shoping {
read -p "输入一个数" a
if [ $a -eq $a ] &> /dev/null 
then
num=$(($a*2))
return 0
else
echo "输入错误"
return 1
fi
}
shoping 
if [ $? -eq 0 ]
then
echo "ok"
else
echo "bad"
fi


[root@test1 opt]# sh test51.sh
输入一个数3
ok


[root@test1 opt]# sh test51.sh
输入一个数r
test51.sh: 第 3 行:[: r: 期待整数表达式
输入错误
bad


#返回码可以自定义,范围0-255。

1.3、函数的传参方式以及函数变量的作用范围:

1.3.1、第一种传参方式:

sum () {
num=$(($1+$2))
echo $num
}
read -p "请输入第一个数" num1
read -p "请输入第一个数" num2
sum $num1 $num2   ##通过位置传参,给$1和$2传参。

[root@test1 opt]# sh test52.sh
请输入第一个数3
请输入第二个数4
7


1.3.2、第一种传参方式:

sum () {
num=$(($1+$2))
echo $num
}
sum $1 $2

sh test62.sh 2 3
5

1.3.3、函数内外赋值优先级

#展示结果,内部 a=10(全局)>外部 a=8 > 内部 local a=12

abc () {

a=5
local b=6
c=10
}
a=8
b=9
c=12
abc
echo $a
echo $b
echo $c

[root@test1 opt]# sh test52.sh
5
9
10


#展示结果,内部a=10(全局)>外部a=8 > 内部local a=12


#加了local(本地值)之后,就是函数内部的变量,而不再是全局变量,外部的赋值会替换内部的变量值

[root@test1 opt]# vim test52.sh

abc () {

local a=5
local b=6
c=10
}
a=8
b=9
c=12
abc
echo $a
echo $b
echo $c



[root@test1 opt]# sh test52.sh
8
9
10


1.3.4、内部及外部赋值输出情况

总结:

在这里插入图片描述

在这里插入图片描述

实验1:
  • 
    [root@test1 opt]# vim test52.sh
    
    abc () {
    echo "inside $a"
    let a++
    local a   
    a=3
    echo "inside2 $a"
    }
    a=8
    abc
    echo "outside $a"
    
    
    
    [root@test1 opt]# sh test52.sh
    inside 8
    inside2 3
    outside 9
    
    
    
    [root@test1 opt]# bash -x test52.sh
    
    + a=8
    + abc
    + echo 'inside 8'
      inside 8
    + let a++
    + local a
    + a=3
    + echo 'inside2 3'
      inside2 3
    + echo 'outside 9'
      outside 9
    
    实验2:
abc () {
echo "inside $a"
let a++
local a
echo "inside3 $a"
a=3
echo "inside2 $a"
}
a=8
abc
echo "outside $a"



[root@test1 opt]# sh test52.sh
inside 8
inside3 
inside2 3
outside 9
解释:流程:

先定义全局变量a=9

调用函数abc,打印 inside1 a ,此处 a,此处 a,此处a=9

a++ :全局变量a自增1,此处$a=10

local a :此时定义的a为函数内部变量,此处 $a 为空,打印inside2 $a为空

a=8:此处把8赋值给内部变量a,打印inside3 a ,此处 a,此处 a,此处a=8

函数结束,到外部打印 outside a ,此时外部 a 为全局变量, a,此时外部a为全局变量, a,此时外部a为全局变量,a=10

1.4、递归函数

在这里插入图片描述

1、阶乘实验1:

[root@test1 opt]# vim test52.sh

#函数递归:函数调用自己本身的函数
#阶乘4的阶乘:4*3*2*1=24
#用函数递归的方式来实现阶乘
jiecheng () {
 if [ $1 -eq 1 ]
  then
  echo 1
 else
  local temp=$(($1-1))
  local result=$(jiecheng $temp)
  echo "$(($1*$result)) "
 fi
}
read -p "输入一个数" num
result1=`jiecheng $num`      ##`**`把命令的结果传给变量,是计算结果传给变量,而不是表面的字符串传给变量,例如a=`ls /opt`,解释opt目录下展示结果传给a
echo $result1



[root@test1 opt]# sh test52.sh
输入一个数6
720

2、阶乘实验2:

[root@test1 opt]# vim test52.sh 

jiecheng () {
 if [ $1 -eq 1 ]
  then
  echo 1
 else
  local a=$(($1-1))
  local b=$(jiecheng $a)
  echo " $(($1*$b)) "
 fi
}
jiecheng $1



[root@test1 opt]# sh test52.sh 7
 5040 

3、使用for循环写阶乘:

  • read -p "请输入一个数" a
    b=$a
    for ((i=a;i>=2;i--))
    do
    b=$(($b*($i-1)))
    done
    echo $b
    
    [root@test1 opt]# sh test52.sh
    请输入一个数6
    720
    
    [root@test1 opt]# bash -x test52.sh
    
    + read -p 请输入一个数 a
      请输入一个数5
    + b=5
    + (( i=a ))
    + (( i>=2 ))
    + b=20
    + (( i-- ))
    + (( i>=2 ))
    + b=60
    + (( i-- ))
    + (( i>=2 ))
    + b=120
    + (( i-- ))
    + (( i>=2 ))
    + b=120
    + (( i-- ))
    + (( i>=2 ))
    + echo 120
      120
    

#面试题:递归目录。把/etc目录下,所有文件递归出来,如果只是目录且该目录下没有文件
就打印目录。否则继续打印,直到目录里面没有文件为止。

在这里插入图片描述

在这里插入图片描述

4、递归实验4:

[root@test1 opt]# vim test52.sh



digui () {
for file in `ls $1`
do
test -d $file
if [ $? -eq 0 ]      ##以上两行==if [ -d $1/$file ]
then
 echo "这是一个目录,$1/$file"
  digui "$1/$file"
else
echo "这是一个文件,$1/$file"
fi
done
}
digui $1





[root@test1 opt]# sh test52.sh /opt
[root@test1 opt]# sh test63.sh /opt
这是一个文件,/opt/!
这是一个目录,/opt/11
这是一个文件,/opt/11/123
这是一个文件,/opt/11/456
这是一个目录,/opt/111
这是一个文件,/opt/111/123

1.5、调用脚本

[root@test1 opt]# vim test54.sh

jiafa () {
result=$(($1+$2))
echo $result

}
jianfa () {
result=$(($1-$2))
echo $result

}
chengfa () {
result=$(($1*$2))
echo $result

}
[root@test1 opt]# vim test55.sh



. /opt/test54.sh
read -p "输入第一个数" num1
read -p "输入第一个数" num2
sum=`jiafa $num1 $num2`
sub=`jianfa $num1 $num2`
mult=`chengfa $num1 $num2`

echo $sum
echo $sub
echo $mult



[root@test1 opt]# sh test55.sh
输入第一个数5
输入第一个数6
11
-1
30

作业1:

在这里插入图片描述

[root@test1 opt]# vim test54.sh



jiafa () {
result=$(echo " scale=2 ; $1 + $2 " | bc )
echo $result
}
jianfa () {
result=$(echo " scale=2 ; $1 - $2 " | bc )
echo $result

}
chengfa () {
result=$(echo " scale=2 ; $1 * $2 " | bc )
echo $result

}



[root@test1 opt]# vim test55.sh

. /opt/test54.sh
read -p "输入第一个数" num1
read -p "输入第一个数" num2
#小数和整数都可以运算,小数点后两位。
sum=`jiafa $num1 $num2`
sub=`jianfa $num1 $num2`
mult=`chengfa $num1 $num2`

echo $sum 
echo $sub
echo $mult

[root@test1 opt]# sh test55.sh
输入第一个数4.5
输入第一个数5.5
10.0
-1.0
24.75

作业2:

#上午我们递归文件的代码,实现了递归出所有目录下的文件。

#所有文件,把后缀名是.txt的文件复制到/opt/dec当中。

[root@test1 opt]# vim test56.sh



digui () {
for file in `ls $1`
do
if [ -d $file ]
then
 echo "这是一个目录,$file"
  digui "$1/$file"
else
echo "这是一个文件,$1/$file"
case $1/$file in
*.txt)
cp $1/$file /opt/dec
;;
*)
esac
fi
done
}
digui $1



[root@test1 opt]# mkdir dec

[root@test1 opt]# sh test56.sh



[root@test1 opt]# cd dec
[root@test1 dec]# ls
1.txt         hosts1.txt  passwd.txt  xy102.txt
erjinzhi.txt  hosts.txt   users.txt



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

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

相关文章

在 Go 中如何让结构体不可比较?

最近我在使用 Go 官方出品的结构化日志包 slog 时,看到 slog.Value 源码中有一个比较好玩的小 Tips,可以限制两个结构体之间的相等性比较,本文就来跟大家分享下。 在 Go 中结构体可以比较吗? 在 Go 中结构体可以比较吗&#xff…

Elasticsearch docker 安装及基本用法

创建网络 首先通过命令创建一个网络 docker network create es-net然后查看网络 [rootDocker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 4e315f5e3ae7 bridge bridge local a501a9f3b4ee es-net bridge local ebca66b02e8c host …

十一、数据结构(图的最短路)

文章目录 基础部分最短路径问题用 D F S DFS DFS搜索所有的路径用 B F S BFS BFS求最短路径 最短路算法 F l o y d Floyd Floydcode(Floyd的实现): S P F A SPFA SPFAcode(基于邻接表的 S P F A ) SPFA) SPFA) D i j k s t r a Dijkstra Dijkstracode(dijkstra的实现…

PHP实现企业微信素材上传与获取的完整指南与踩坑日记

企业微信作为一款专门为企业打造的即时通讯工具,提供了丰富的功能和接口,其中包括素材管理。素材管理在企业内部的沟通、分享和展示中起着重要的作用。本篇文章将介绍如何使用PHP语言对接企业微信素材上传和获取的功能。 ## 1. 准备工作 首先&#xff0…

AI数据分析:Excel表格智能判断数据起点来计算增长率

工作任务:计算Excel表格中2023年1月到2024年4月的总增长率和复合增长率。 如果数据都有的情况下,公式很简单: 总增长率 (O2-B2)/B2 复合增长率 POWER((O2/B2),1/13)-1 但是,2023年1月、2月、3月的数据,有些有&…

LLM2Vec论文阅读笔记

这是篇LLM论文,用decoder-like的LLM去提取embedding文章认为,decoder-like的LLM在text embedding task表现不优的一大原因就是其casual attention mechanism,其实就是mask的问题。所以只要对现有的decoder-only LLM进行如下三步改进&#xff…

SpringBoot配置第三方专业缓存技术jetcache方法缓存方案

jetcache方法缓存 我们可以给每个方法配置缓存方案 JetCache 是一个基于 Java 的缓存库,支持多种缓存方案和缓存策略,主要用于提升应用程序的性能和响应速度。它提供了多种缓存模式和特性,可以根据需求选择合适的缓存方案。 JetCache 的主…

VPC Access Connector 介绍 - 让 Non-VPC product 也可以访问VPC Network内的资源

什么是VPC product 和 非 VPC product 在GCP 上, VPC product 指的是属于某个制定的vpc subnet, 具有至少1个 该 subnet 的内网ip的产品 常见的例如: compute engine / MIG (managed instances group)某些dataflow job (指定了 可选参数subnet )Cloud …

C++设计模式——Composite组合模式

一,组合模式简介 真实世界中,像企业组织、文档、图形软件界面等案例,它们在结构上都是分层次的。将系统分层次的方式使得统一管理和添加不同子模块变得容易,在软件开发中,组合模式的设计思想和它们类似。 组合模式是…

复分析——第4章——Fourier变换(E.M. Stein R. Shakarchi)

第4章 Fouier变换 Raymond Edward Alan Christopher Paley, Fellow of Trinity College, Cambridge, and International Research Fellow at the Massachusetts Institute of Technology and at Harvard University, was killed by an avalanche on April 7, 1933, whi…

Golang | Leetcode Golang题解之第166题分数到小数

题目&#xff1a; 题解&#xff1a; func fractionToDecimal(numerator, denominator int) string {if numerator%denominator 0 {return strconv.Itoa(numerator / denominator)}s : []byte{}if numerator < 0 ! (denominator < 0) {s append(s, -)}// 整数部分numer…

中科数安 | 加密管理系统

中科数安提供的加密管理系统是一套全面而高效的数据安全解决方案&#xff0c;旨在保护企业核心文件资料的安全。该系统结合了多种先进的技术手段和管理策略&#xff0c;确保企业数据在存储、传输和使用过程中都得到严格的保护。 www.weaem.com 以下是中科数安加密管理系统的主要…

ES 8.14 Java 代码调用,增加knnSearch 和 混合检索 mixSearch

1、pom依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>8.14.0</version></dependency><dependency><groupId>co.elastic.clients<…

可解释机器学习之SHAP方法

以Breast cancer wisconsin (diagnostic) dataset数据集为例。 # Built-in libraries import math import numpy as np import pandas as pd# Visualization libraries import matplotlib.pyplot as plt import seaborn as sns# Sklearn libraries # from skle…

项目估算

1.项目估算的基本内容 2.基本估算方法 3.WBS估算法 4.资源估算的基本过程 5.由工作量和开发周期来估算 6.资源特征描述 7.项目角色职能确定 8.工期估算方法 9.成本估算方法 10.LOC估算法 LOC&#xff08;Lines of Code&#xff0c;代码行数&#xff09;估算法是一种简单且直接…

Gracia:打造超逼真VR体验,引领体积视频新时代

在数字化浪潮中,虚拟现实(VR)技术以其独特的沉浸式体验,逐渐成为科技前沿的热点。而在这个领域中,Gracia正以其创新的体积视频技术,为用户带来前所未有的真实感VR体验,致力于成为“空间计算领域的YouTube”。 Gracia,一个充满活力的初创公司,已经获得了120万美元的种…

【记录44】【案例】echarts地图

效果&#xff1a;直接上效果图 环境&#xff1a;vue、echarts4.1.0 源码 // 创建容器 <template><div id"center"></div> </template>//设置容器大小&#xff0c;#center { width: 100%; height: 60vh; }这里需注意&#xff1a;笔者在echar…

音频基础知识和音频指标

音频基础知识 声音 声音&#xff08;sound)是由物体振动产生的声波。物体在一秒钟之内振动的次数叫做频率&#xff0c;单位是赫兹&#xff0c;字母Hz。人耳可以识别的声音频率在 20 Hz~20000 Hz之间&#xff1b; 声音三要素&#xff1a; 响度 响度&#xff0c;…

谷歌Google广告开户是怎么收费的?

谷歌Google广告无疑是企业拓展全球视野、精准触达目标客户的强大引擎。而作为这一旅程的启航站&#xff0c;开户流程的便捷性与成本效益成为了众多企业关注的焦点。云衔科技&#xff0c;作为数字化营销解决方案与SaaS软件服务的领军者&#xff0c;正以其专业、高效的服务体系&a…

【凤凰房产-注册安全分析报告-缺少轨迹的滑动条】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…