shell编程之循环语句与函数

news2024/12/23 17:38:03

文章目录

  • 一.shell函数
    • 1.作用
    • 2.使用函数的优势
    • 3.shell函数定义
      • 3.1方式1:
      • 3.2方式2:
    • 4.调用函数的方法
    • 5.函数返回值
      • 5.1 return
      • 5.2 exit
    • 6.1-100奇偶求和相加
  • 二.函数传参
    • 1.含义
    • 2.函数传参的方式
  • 三.函数变量的作用范围
    • 1.函数变量的作用范围
    • 2.调用函数
      • 2.1示例:
    • 3.递归
      • 3.1含义
      • 3.2递归示例
    • 4.阶乘
      • 4.1阶乘的含义
      • 4.2阶乘示例
    • 5.函数库
    • 6.拓展

一.shell函数

1.作用

(1)将命令序列按格式写在一起

(2)可方便重复使用命令序列

2.使用函数的优势

(1)使用函数可以避免代码冲突

(2)将大的工程可以分割为若干小的功能模块,代码的可读性更强

3.shell函数定义

3.1方式1:

[function] 函数名 () {

命令系列

[return x]————————使用return或exit可以显示地结束函数

}

3.2方式2:

函数名 () {

命令系列

}

4.调用函数的方法

函数名 [参数1] [参数2]

5.函数返回值

5.1 return

退出函数并返回一个退出值,作用于函数内部,函数返回值的范围:0~255之间(0就是成功,只要返回值非0也都认为失败,在shell中的返回码可以自定义,因此可以让成功也可以让失败。

function abc {

read -p "输入一个数字:" a
a=$(($a*2))
return 0
}
abc————————————————必须加函数名,用来调用
echo $a

在这里插入图片描述

5.2 exit

终止函数运行,exit0,函数执行exit语句,整个脚本将立刻停止,并把指定的退出状态码返回给调用者。

function abc {

read -p "输入一个数字:" a
a=$(($a*2))
exit 0
}
abc
echo $a

在这里插入图片描述

6.1-100奇偶求和相加

第一种:

oushu () {
sum1=0
for i in `seq 2 2 100`
 do
 sum1=$(($i+$sum1))
done
}
oushu
 echo $sum1
jishu () {
sum2=0
for o in `seq 1 2 100`
 do
 sum2=$(($o+$sum2))
done
}
jishu
 echo $sum2
total=$(($sum1+$sum2))
echo $total 

在这里插入图片描述

第二种:

jishu () {
sum1=0
for ((i=1;i<=100;i+=2))
do
sum1=$(($sum1+$i))
done
}
jishu
echo $sum1

oushu () {
sum2=0
for ((j=2;j<=100;j+=2))
do
sum2=$(($sum2+$j))
done
}
oushu
echo $sum2

total=$(($sum1+$sum2))
echo $total

在这里插入图片描述

二.函数传参

1.含义

在shell中,调用函数时可以向其传递参数

在函数体内部,通过$n的形式来获取参数的值

2.函数传参的方式

方式一:

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

read -p "请输入第一个数:" first
read -p "请输入第二个数:" second
sum1 $first $second

[root@test1 opt]# chmod 777 cc.sh

[root@test1 opt]# ./cc.sh

在这里插入图片描述

方式二:

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

在这里插入图片描述

三.函数变量的作用范围

1.函数变量的作用范围

(1)函数在Shell脚本中仅在当前Shell环境中有效

(2)Shell脚本中变量默认全局有效

(3)将变量限定在函数内部使用local命令

2.调用函数

加了local只能在函数内部生效,如果函数外重新定义,值会被更改,

调用函数:第一步内部没定义传外部的9,第二步内部重新定义全局变量为8不受外部影响,第三步第一次已经传参进去打印。

2.1示例:

bash -x + 脚本名称 ——查看详细过程

在这里插入图片描述
在这里插入图片描述

abc () {
echo "inside $i"————————————#定义了外部9
let i++
local i
i=8
echo "inside $i"

}
i=9
abc
echo "outside $i"

在这里插入图片描述

3.递归

3.1含义

函数调用自己本身的函数

3.2递归示例

/etc,展示/etc 目录下的所有内容

mulu () {
for i in `ls $1`
do
 if [ -d "$1/$i" ] #是否为目录
  then
   echo "$1$i"
   muli "$1/$i"#不是目录的话要打印文件,调用查看目录下是否还有东西
 else
  echo "$i"  #$2 为空,不传参,只输入文件名
fi
done
}
mulu $1

在这里插入图片描述

在这里插入图片描述

4.阶乘

4.1阶乘的含义

阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。

例如所要求的数是4。则阶乘式是1x2x3x4,得到的积是24,24就是4的阶乘。 例如所要求的数是6.则阶乘式足1x2x3*…6,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是1x2x3*…*n,设得到的积是x,x就是n的阶难。

总:输入一个数一直乘到自己,1不算,每一次自己减一再作为参数乘以自己到1不乘。

4.2阶乘示例

jiecheng () {
if [ $1 -eq 1 ]
 then
  echo 1
else
 local number=$(($1-1))
 local result=$(jiecheng $number) #自己乘自己每次的
结果减1
 echo "$(($1*$result))"
fi
}
read -p "输入一个数求阶乘: " num
result=`jiecheng $num`
echo $result

在这里插入图片描述

5.函数库

vim hsk.sh
jiafa () {
result=$(($1+$2))
echo $result
}

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

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

chufa () {
if [ $2 -ne 0 ]
 then
result=$(($1/$2))
echo $result

else
 echo "$2不能是0!"
fi

调用数据库

vim dy.sh
. /opt/hsk.sh
read -p "请输入第一个数:" first
read -p "请输入第二个数:" second
a=`jiafa $first $second`
b=`jianfa $first $second`
c=`chengfa $first $second`
d=`chufa $first $second`

echo $a
echo $b
echo $c
echo $d

在这里插入图片描述

6.拓展

函数能够接受一个参数,参数为用户名; 判断一个用户是否存在 如果存在,就返回此用户的shell 和 UID ;并返回正常状态值; 如果不存在,就说此用户不存在;并返回错误状态值。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

什么蓝牙耳机戴着舒服,介绍几款佩戴舒适的骨传导蓝牙耳机

骨传导耳机是一种新式的耳机&#xff0c;与常规听歌的入耳式耳机相比&#xff0c;不需要将耳机塞住的耳道&#xff0c;在长时间佩戴时不会损伤听觉。能听声音不需要入耳&#xff0c;在户外运动时能及时听到环境音&#xff0c;避免安全隐患。现在市场上有骨传导。以下是一些骨传…

解决message(antd-design组件库)弹窗多次数出现的问题

当我们多次点击按钮的时候&#xff0c;会出现下图这样的情况&#xff1a; 网址&#xff1a; 全局提示 Message - Ant Design 这样看起来&#xff0c;会降低用户的体验。所以&#xff0c;我想要的效果是&#xff0c;点一次出现一次&#xff0c;当我再次点击的时候&#xff0c;会…

二叉搜索树桶排序

1、二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树 *若它的左子树不为空则左子树上所有的节点的值都小于根节点的值 *若它的右子树不为空则右子树上所有的节点的值都大于根节点的值 *它的左右子树也分别是一棵二叉搜索树 *二…

皮卡丘CSRF

1.CSRF&#xff08;get&#xff09; 首先看提示&#xff0c;我们选择用户kobe&#xff0c;密码123456登录 点击修改个人信息&#xff0c;假如用户要把住址改为shanxi 再点击submit&#xff0c;同时用bp抓包&#xff0c;我们可以看到是get请求&#xff0c;数据包含在URL之中 将…

web服务器有哪些

<1>什么是web服务器 “网络服务”&#xff08;Web Service&#xff09;的本质&#xff0c;就是通过网络调用其他网站的资源。 Web Service架构和云 如果一个软件的主要部分采用了”网络服务”&#xff0c;即它把存储或计算环节”外包”给其他网站了&#xff0c;那么我…

【Linux网络编程】HTTPS协议原理

https协议原理 一、HTTPS是什么二、基本概念2.1、什么是加密2.2、为什么要加密 三、常见的加密方式四、数据摘要(指纹)&&数字签名五、HTTPS的工作过程探究方案&#xff08;1&#xff09;&#xff1a;只使用对称加密方案&#xff08;2&#xff09;&#xff1a;只使用非对…

论文笔记--PANGU-α

论文笔记--PANGU-α: LARGE-SCALE AUTOREGRESSIVE PRETRAINED CHINESE LANGUAGE MODELS WITH AUTO-PARALLEL COMPUTATION 1. 文章简介2. 文章概括3 文章重点技术3.1 Transformer架构3.2 数据集3.2.1 数据清洗和过滤3.2.2 数据去重3.2.3 数据质量评估 4. 文章亮点5. 原文传送门6…

旧改快讯--罗湖蔡屋围项目二期子项目D、E启动行政征收

蔡屋围城市更新统筹片区蔡屋围&#xff08;城中村&#xff09;项目二期子项目D&#xff08;南村片区&#xff09;、子项目E&#xff08;南村东片区&#xff09;房屋征收提示 5月9日&#xff0c;深圳市罗湖区城市更新和土地整备局发布关于罗湖区桂园街道蔡屋围城市更新统筹片区…

[架构之路-204]- 常见的需求分析技术:结构化分析与面向对象分析

目录 前言&#xff1a; 1 1 . 3 需求分析概述 导言&#xff1a; 11.3.1需求分析的任务 (1) 绘制系统上下文范围关系图&#xff1a; (2) 创建用户界面原型&#xff1a; (3) 分析需求的可行性&#xff1a; (4) 确定需求的优先级&#xff1a; (5) 为需求建立模型&#xf…

DetailGAN

1.摘要 本文提出了一种基于保留细节的对抗学习的红外和可见光图像融合的端到端模型。它能够克服传统融合方法中基于活动级别测量和融合规则的手动和复杂设计的局限性。考虑到红外和可见光图像的特定信息&#xff0c;我们设计了两个损失函数&#xff0c;包括细节损失和目标边缘…

738.单调递增的数字;968.监控二叉树

贪心 738.单调递增的数字思路:代码 968.监控二叉树思路:如何放置&#xff0c;才能让摄像头最小的呢&#xff1f; 738.单调递增的数字 思路: 举例&#xff0c;数字&#xff1a;332&#xff0c;从前向后遍历的话&#xff0c;那么就把变成了329&#xff0c;此时2又小于了第一位的…

mysql密码字段类型

数值 mysql 的数值数据类型可以大致划分为两个类别&#xff0c;一个是整数&#xff0c;另一个是浮点数或小数。 许多不同的子类型对这些类别中的每一个都是可用的&#xff0c;每个子类型支持不同大小的数据&#xff0c;并且 MySQL 允许我们指定数值字段中的值是否有正负之分(U…

【owt】WebrtcNode, subscribe流程

subscribe流程 1. AmqpClient - New message received 2023-04-26T21:54:18.415 - DEBUG: AmqpClient - RpcServer New message received {method: subscribe,args: [b149e44bb10d4e91bd162a8c6806ae7b,webrtc,{transportId: b149e44bb10d4e91bd162a8c6806ae7b,tracks: [Arr…

C4网络技术挑战赛 智慧园区方案分析

添加链接描述 智慧园区网络 市场现状: 网络与应用系统多厂商、多平台、多系统,导致IT部门管理运维复杂&#xff0c;效率低下. 统一运维管理&#xff1f; 无线网络与物联网的双网合一&#xff1f; ps&#xff1a; 无线网络(英语:Wireless network)指的是任何型式的无线电计…

【Mysql数据库从0到1】-入门基础篇--mysql基本使用

【Mysql数据库从0到1】-入门基础篇--mysql基本使用 &#x1f53b;一、Mysql5.7 VS Mysql8.0 详解1.1 ⛳字符编码1.2 ⛳用户的创建与授权1.3 ⛳ 认证插件1.4 ⛳ 隐藏索引1.5 ⛳ 持久化设置1.6 ⛳ 通用表表达式&#xff08;Common Table Expressions&#xff09;1.7 ⛳ 性能提升1…

redis缓存单体服务测试本地锁失效问题

测试1&#xff1a;锁释放之后向redis缓存存入数据 //TODO 产生堆外内存溢出 OutOfDirectMemoryError//gulimall.com查询分类Overridepublic Map<String, List<CategoryLevel2Vo>> getCatelogJson() {/*** 问题 &#xff1a;解决办法* 1.缓存穿透 高并发情况下查询缓…

Java学习方式分享

哈喽&#xff0c;大家好呀&#xff0c;好久不见&#xff01;咱依然是那个腼腆害羞内向社恐文静、唱跳rap篮球都不大行的【三婶er】 坦白地说&#xff0c;今天是偶然看到C站这个活动的&#xff0c;这个主题我颇有感触&#xff0c;刚学java时的场景&#xff0c;历历在目。所以今天…

ChatGPT常见的报错解决方法(全网最全解决方法)

因为最近在使用ChatGPT的过程中&#xff0c;时常会出现一些错误提示&#xff0c;为了方便自己快速解决问题&#xff0c;所以也搜集了一些其他博主的解决方法&#xff0c;以下是整理的内容。 目录 1、拒绝访问 2、Access denied错误 3、We have detected suspicious 错误 4…

leetcode_19_相同的树

bool isSameTree(struct TreeNode* p, struct TreeNode* q){if(pNULL && qNULL)return true;//其中一个为空if(pNULL || qNULL)return false;//都不为空,且首节点的值不相等if(p->val ! q->val)return false;//p和q的值相等&#xff0c;分别比较左子树和右子树re…

如何使用debugHunter发现隐藏调试参数和Web应用程序敏感信息

关于debugHunter debugHunter是一款针对Web应用程序隐藏调试参数和敏感信息的识别扫描工具,该工具本质上是一个Chrome扩展,可以帮助广大研究人员扫描目标Web应用程序/网站以查找调试参数,并在发现了包含修改响应的URL时发送通知。该扩展利用了二分查找算法来有效地确定导致…