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

一、函数

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.shfunction 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.shabc () {
read -p "输入一个数" num
a=$(($num*2))
return $a
}
abc[root@test1 opt]# sh test57.sh
输入一个数8
[root@test1 opt]# vim test57.shabc () {
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 $2sh 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.shabc () {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.shabc () {
    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 ]thenecho 1elselocal 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 ]thenecho 1elselocal a=$(($1-1))local b=$(jiecheng $a)echo " $(($1*$b)) "fi
}
jiecheng $1[root@test1 opt]# sh test52.sh 75040 

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 120120
    

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

在这里插入图片描述

在这里插入图片描述

4、递归实验4:

[root@test1 opt]# vim test52.shdigui () {
for file in `ls $1`
do
test -d $file
if [ $? -eq 0 ]      ##以上两行==if [ -d $1/$file ]
thenecho "这是一个目录,$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.shjiafa () {
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.shjiafa () {
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.shdigui () {
for file in `ls $1`
do
if [ -d $file ]
thenecho "这是一个目录,$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.mzph.cn/diannao/29980.shtml

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

相关文章

CubeMx打不开

问题点:打开CubeMx一直这个界面,然后就消失了。 问题所在:java版本过高。 博主的版本是合适的,如果你的版本是17什么的肯定是不合适的。 解决方法:卸载重装 卸载工具站内下载,免安装:&#xf…

极速解析,精准合规 — Ada,现代C++的URL解析器

Ada:用Ada,让URL解析变得轻而易举。- 精选真开源,释放新价值。 概览 Ada是一个用现代C编写的快速且符合WHATWG标准的URL解析库。它通过了WHATWG网站提供的全部规范测试,并在包括Windows、Linux、macOS在内的多个平台上表现卓越。…

Python将Markdown格式转为HTML:轻松实现博客文章的自动化处理

哈喽,大家好,我是木头左! 引言 编写一篇高质量的博客文章并非易事,尤其是在排版和格式方面。Markdown作为一种轻量级的标记语言,为博主们提供了一种简洁、高效的写作方式。而Python作为一门强大的编程语言&#xff0c…

反射的原理和操作

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 在Java中,反射是指在运行时动态地获取、检查和操作类、对象、方法和属性的能力。J…

本地快速部署 SuperSonic

本地快速部署 SuperSonic 0. 引言1. 本地快速部署 supersonic2. 访问 supersonic3. 支持的数据库4. github 地址 0. 引言 SuperSonic融合Chat BI(powered by LLM)和Headless BI(powered by 语义层)打造新一代的BI平台。这种融合确…

C++ 66 之 类模版

#include <iostream> #include <string> using namespace std;// 习惯性 < >中 类模板用class 普通的函数模板就用typename // template<class NAMETYPE, class AGETYPE> template<class NAMETYPE, class AGETYPE int> // 可以设置默认的类型值…

【数据结构C++】表达式求值(多位数)课程设计

&#x1f4da;博客主页&#xff1a;Zhui_Yi_ &#x1f50d;&#xff1a;上期回顾&#xff1a;图 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f387;追当今朝天骄&#xff0c;忆顾往昔豪杰。 …

【机器学习】第7章 集成学习(小重点,混之前章节出题但小题)

一、概念 1.集成学习&#xff0c;顾名思义&#xff0c;不是一个玩意&#xff0c;而是一堆玩意混合到一块。 &#xff08;1&#xff09;基本思想是先 生成一定数量基学习器&#xff0c;再采用集成策略 将这堆基学习器的预测结果组合起来&#xff0c;从而形成最终结论。 &#x…

pdf怎么压缩到2m以内或5m以内的方法

PDF作为一种广泛使用的文档格式&#xff0c;已经成为我们工作和生活中不可或缺的一部分。然而&#xff0c;有时候PDF文件内存会比较大&#xff0c;给我们的存储和传输带来了很大的不便。因此&#xff0c;学会压缩 PDF 文件是非常必要的。 打开"轻云处理pdf官网"&…

js语法---理解防抖原理和实现方法

什么是防抖&#xff08;节流&#xff09; 在实际的网页交互中&#xff0c;如果一个事件高频率的触发&#xff0c;这会占用很多内存资源&#xff0c;但是实际上又并不需要监听触发如此多次这个事件&#xff08;比如说&#xff0c;在抢有限数量的优惠券时&#xff0c;用户往往会提…

Scott Brinker:API对今天的Martech用户来说「非常重要」 ,但它们对即将到来的人工智能代理浪潮至关重要

API在Martech中非常重要 猜一猜空格应该填什么&#xff1a; _______之于AI代理就像数据之于AI模型 正如你可能从我的标题猜到的那样&#xff0c;答案是API。让我们讨论一下为什么…… 数据是人工智能模型的差异化 在过去的一年半里&#xff0c;人工智能疯狂的超级炒作周期…

Repetition Improves Language Model Embeddings论文阅读笔记

文章提出了一种提高decoder-only LLM的embedding能力的方法&#xff0c;叫echo embeddingslast-token pooling&#xff08;即直接选最后一个token作为句子的embedding&#xff09;和直接mean pooling都不如文章提出的echo embedding&#xff0c;做法是把句子重复两次&#xff0…

OpenGL Super Bible 7th - Drawing Our First Triangle(绘制第一个三角形)

简介 本文的原版为《OpenGL Super Bible 7th》,是同事给我的,翻译是原文+译文的形势。文章不属于机器直译,原因在于语言不存在一一对应的关系,我将尽可能的按照中国人看起来舒服的方式来翻译这些段子,如果段子让你感到身心愉悦,那还劳烦点个关注,追个更。如果我没有及时…

【论文阅读】-- Attribute-Aware RBFs:使用 RT Core 范围查询交互式可视化时间序列颗粒体积

Attribute-Aware RBFs: Interactive Visualization of Time Series Particle Volumes Using RT Core Range Queries 1 引言2 相关工作2.1 粒子体渲染2.2 RT核心方法 3 渲染彩色时间序列粒子体积3.1 场重构3.1.1 密度场 Φ3.1.2 属性字段 θ3.1.3 优化场重建 3.2 树结构构建与调…

算法题day45(补5.31日卡:动态规划05)

一、完全背包理论基础&#xff1a; 完全背包和01背包问题唯一不通过的地方就是&#xff0c;每种物品有无限件。 二、刷题&#xff1a; 1.卡码网 52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; (kamacoder.com)(medium&#xff09; 解决: nv input().strip().sp…

如何在 Windows 中安装 Spire.PDF for Python

Spire.PDF for Python 是一款完全独立的 PDF 开发组件&#xff0c;用于在任何 Python 应用程序中读取、创建、编辑和转换 PDF 文件。本文将介绍如何在 Windows 中安装 Spire.PDF for Python。 最新python安装激活教程在下方&#xff1a; 步骤1 下载最新版的 Python 并将其安装…

MYSQL数据库安装

一.编译安装MySQL服务 1.安装环境依赖包 2.将安装mysql 所需软件包传到/opt目录下 mysql-boost-5.7.44.tar tar zxvf mysql-boost-5.7.44.tar.gz 3.配置软件模块 cd /opt/mysql-5.7.44/ cmake \ -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DMYSQL_UNIX_ADDR/usr/local/mysq…

MyBatis中获取Mysql数据库插入记录的主键值

在MyBatis中&#xff0c;你可以使用多种方式获取插入记录的主键值。以下是常见的几种方法&#xff1a; 1. 使用 useGeneratedKeys 和 keyProperty 这是MyBatis提供的最直接的方法。在你的Mapper XML文件中&#xff0c;使用 useGeneratedKeys 和 keyProperty 来指定MyBatis在插…

ES8新特性:async函数

1、async函数 返回值为promise对象&#xff1b;promise对象的结果由async函数执行的返回值决定。 2、await 表达式 await 必须写在 async 函数里面&#xff1b;await 右侧的表达式一般为promise对象,返回该对象的结果&#xff0c;如果不是promise对象&#xff0c;就直接返回对…

【云手机】数据安全如何保障?

安全办公&#xff0c;信息安全&#xff0c;这是企业使用云手机的初衷和目的&#xff0c;云手机在数据保密&#xff0c;远程办公等功能上有巨大的优势&#xff0c;也为企业提供了支持 首先就是云手机能够实现数据的集中管理和加密存储。所有办公相关的数据都存储在云端的安全服务…