Linux ---- Shell编程之函数与数组

目录

一、函数

1、函数的基本格式

2、查看函数列表

3、删除函数

4、函数的传参数

5、函数返回值

实验:

1.判断输入的ip地址正确与否

2. 判断是否为管理员用户登录

6、函数变量的作用范围

7、函数递归(重要、难点)

实验:

递归遍历目录

​编辑一键安装nginx 

阶乘

1.用for循环求阶乘

2.用函数求阶乘​编辑

附加:sed

二、数组

1、数组介绍

2、引言

3、shell数组的定义

4、定义数组格式

方法一:

方法二:

方法三:

实验:

 简单随机点名

方法一:

方法二:

 5、数组索引

6、数组定义方法

实验:取最大值

7、冒泡排序法:

举例:


一、函数

  • 将命令序列按格式写在一起
  • 可以方便重复使用命令序列
  • 函数也是一种脚本的别名

使用函数

1、先进性定义

2、再调用

1、函数的基本格式

[function] 函数名(){命令序列
[return x]                           #使用return或exit可以显示的结束函数 
}或者
-------------------------------第二种使用较多---------------------------------------------------#也可以省略掉[function],它表示该函数的功能函数名() {                            #函数名后面()是没有内容的命令序列                            #我们执行的命令内容放在{}里面
}----------------------------------------------------------------------------------
[function] 函数名 {命令序列}
  • 函数定义完之后并不会自动执行,需要调用才行
  • 好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错
  • 当然我们写函数最终目的还是为了调用,为了实现某个功能块。

举例:

#!/bin/bash
h () {
echo "hello"
}niao () {
echo `h` `w`
}w () {
echo "world"
}nihao

 

最简单的例子

vim  func.sh#!/bin/bashhaha () {echo "hello"}haha
#这个是调用hellobash func.sh

123

如果在其他文件中调用这个文件

添加颜色

2、查看函数列表

declare  -F                  ##查看当前已定义的函数名declare  -f                  ##查看当前已定义的函数定义declare  -f  func_name      ##查看指定当前已定义的函数名declare  -F  func_name      ##查看当前已定义的函数名定义

3、删除函数

删除函数:   unset func_name

[root@localhost data]#func1 () { hostname;hostname -I; }
[root@localhost data]#func1
localhost.localdomain
20.0.0.100 192.168.122.1 
[root@localhost data]#unset func1
[root@localhost data]#func1
bash: func1: 未找到命令...

4、函数的传参数

#!/bin/bashh () {
echo "第一个参数是:$1 $2 $3"}h $1 $2 $3       ##调用

调换位置

#!/bin/bashh () {
echo "第一个参数是:$1 $2 $3"}h $2 $1 $3       ##调用

5、函数返回值

实验:

1.判断输入的ip地址正确与否

使用原则:

1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为除以256取余return        ###只能用在函数中
###return      从函数中返回,用最后状态命令决定返回值
###return 0    无错误返回
###return 1    有错误返回exit 100      ##exit退出整个脚本

 

2. 判断是否为管理员用户登录

6、函数变量的作用范围

函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令

7、函数递归(重要、难点)

调用自己本身的函数

可以写病毒

[root@localhost ~]#func () { echo $i;echo "run fast";let i++; func; }func

for炸弹

:(){ :|:& };:                         //:就是一个字符 可以写成单词
bomb() { bomb | bomb & }; bomb

执行bomb以后会死机,除非重启,在没有其他办法。

实验:

递归遍历目录

一键安装nginx 

阶乘

0和1的阶乘都为1

自然数n的阶乘写作n!

1.用for循环求阶乘

2.用函数求阶乘

附加:sed

sed  -i   “s/旧/新/g”   文件名      ###  -i   选项是真的改#sed -i "s/root/admin/g"  passwd
#当面文件夹下的passwd里的root改为admin

sed  -i.bak  "s/admin/root/g" passwd    ### -i.bak 是做备份,.bak只是后缀名,可以任意写

sed "2a/hahahahaha"  passwd        ### a是插入的意思,2a是在第二行后面插入

sed

  • i    :在前面插
  • a   :在后面插
  • c   :整行替换

二、数组

1、数组介绍

数组和变量:

  • 数组:储存多个元素的连续的内存空间,相当于多个变量的集合
  • 变量:存储单个元素的内存空间

2、引言

将全班学生定义成一个变量,无法使用普通变量。

  • 普通数组

  • 关联数组

变量和数组

  • 变量:存储单个元素的内存空间

  • 数组:存储多个元素的连续的内存空间,相当于多个变量的集合

数组名和索引

  • 索引的编号从0开始,属于数值索引

  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持

  • bash的数组支持稀疏格式(索引不连续)

3、shell数组的定义

数组中可以存放多个值,Bash Shell 只支持一维数组(不支持多维数组)

数组元素的下标由 0 开始

Shell 数组用括号来表示,元素用"空格"符号分割开

在shell语句中,使用、遍历数组的时候,数组格式要写成 ${arr[@]} 或 ${arr[*]}

4、定义数组格式

方法一:

数组名=(value1 value2 ... valuen)
[root@localhost lyh]#a=(1 2 3 4 5)
[root@localhost lyh]#echo ${a[@]}
1 2 3 4 5
[root@localhost lyh]#echo ${a[*]}
1 2 3 4 5

方法二:

数组名=([0]=value0 [1]=value0 [2]=value0 ...)
[root@localhost lyh]#b=([0]=1 [1]=2 [2]=3 [3]=4 [4]=5)
[root@localhost lyh]#echo ${b[@]}
1 2 3 4 5

方法三:

数组名[0]="value"
数组名[1]="value"
数组名[2]="value"[root@localhost lyh]#c[0]=1
[root@localhost lyh]#c[1]=2
[root@localhost lyh]#c[2]=3
[root@localhost lyh]#c[3]=4
[root@localhost lyh]#echo ${c[@]}
1 2 3 4

实验:

 简单随机点名
方法一:

方法二:

 5、数组索引

数组名和索引

  • 索引的编号从0开始,属于数值索引
  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash  4.0版本之后开始支持
  • bash的数组支持稀疏格式(索引不连续)

索引分为两种:普通索引和关联索引

普通索引:上面解释了

关联索引:①下表可以是文字:称为关联索引  键值对的关系

                  下表可以不连续,称为稀疏格式

 注意:关联数组和普通数组都要先声明,普通可以声明也可以不用声明

            但是关联数组必须要先声明

定义关联数组一定要声明,不声明就没有效果

[root@localhost data]#declare -A 数组名      -A 声明关联数组
[root@localhost data]#declare -a  数组名     -a  声明普通数组, 

不是变量是数组

只能把这个删了重新声明,不声明就会混乱

6、数组定义方法

方法一(一次赋值全部元素):
数组名=(value0 valuel value2 ...)
a=(10 20 30 40 50)方法二(只赋值特定元素):
数组名=([0]=value[1]=value[2]=value ··)
b=([0]=10[1]=20[21=30)方法三:
列表名="value0 valuel value2..."
数组名=(S列表名)
[root@localhost data]#b="12345 6"
[root@localhost data]#c=$b
[root@localhost data]#echo ${c[*]}
123456方法四(一次只赋值一个元素):   追加  修改
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"方法五:read-a  交互式
[root@localhost datal#touch{1..10}.txt
[root@localhost datal#file=(*.txt)    //当前文件夹下的,所有txt结尾的文件
[root@localhost datal#echo $file
10.txt

实验:

取最大值

取最小值: 

随机数

 

7、冒泡排序法:

数组排序算法:冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。

基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。

算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

score=(77 13 91 56 88)两两对比,第1个和第2个比,小的值到前面,大的值到后面。
以此类推。第2个和第3个比,第3个和第4个比,第4个和第5个比------------第一轮------------
77 13 91 56 88 第一次对比 数组长度-1 第一轮比较往后值, 最大值为91 
13 77 91 56 88 第二次对比 
13 77 91 56 88 第三次对比 
13 77 56 91 88 第四次对比 
13 77 56 88 91
------------第二轮------------
13 77 56 88 91 第一次对比 数组长度-1第二轮比较往后,第二大的数字88 
13 77 56 88 91 第二次对比 
13 56 77 88 91 第三次对比 
13 56 77 88 91
------------第三轮-----------
13 56 77 88 91 第一次对比 数组长度-1第三轮比较往后,第三大的数字77 
13 56 77 88 91 第二次对比 
13 56 77 88 91
------------第四轮-----------
13 56 77 88 91 第一次对比 数组长度-1第四轮比较往后,第四大的数字56 
13 56 77 88 91

举例:

#!/bin/bash
array=(98 76 24 100 35 3)
echo "old_array:${array[*]}"
lt=${#array[*]}
#定义比较轮数,比较轮数为数组长度-1,从1开始
for ((i=1;i<$lt;i++))
do#确定比较元素的位置,比较相邻两个元素,较大的数往后放,比较次数随比较轮数而
减少for ((j=0;j<$lt-i;j++))do#定义第一个元素的值first=${array[$j]}#定义第二个元素的值k=$[$j+1]second=${array[$k]}#如果第一个元素比第二个元素大,就互换if [ $first -gt $second ];then#把第一个元素的值保存到临时变量中temp=$first#把第二个元素值赋给第一个元素array[$j]=$second#把临时变量赋给第二个元素array[$k]=$tempfidone
done
echo "new_array:${array[@]}"

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

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

相关文章

力扣hot100 数据流的中位数 大小根堆

Problem: 295. 数据流的中位数 文章目录 思路复杂度&#x1f496; Code 思路 &#x1f468;‍&#x1f3eb; 参考 大根堆维护较小值&#xff08;堆顶即中位数&#xff09;&#xff0c;小根堆维护较大值&#xff08;堆顶可能是中位数之一&#xff09;维护小堆长度较长&#x…

第九节HarmonyOS 常用基础组件21-ImageAnimator

1、描述 提供帧动画组件来实现逐帧播放图片的能力&#xff0c;可以配置需要播放的图片列表&#xff0c;每张图片可以配置时长。 2、接口 ImageAnimator() 3、属性 参数名 参数类型 描述 images Array<ImageFrameInfo> 设置图片帧信息集合&#xff0c;每一帧的帧…

启动盘重装ubuntu22系统

win+R msinfo32查看 插入制作好的u盘电脑开机 进入BIOS界面的方法有多种,以下是一些常见的方法: 进入BIOS界面的最常见按键有: Del键:大多数台式机通过在启动时按下Del键来进入BIOS。Esc键:在AMI BIOS和某些品牌电脑中,进入BIOS系统需要按“Esc”键,一般在开机画面…

消息中间件之RocketMQ源码分析(四)

消费者的Rebalance机制 客户端是通过Rebalance服务做到高可靠的。当发生Broker掉线、消费者实例掉线、 Topic扩容等各种突发情况时&#xff0c;消费者组中的消费者实例是怎么重平衡的&#xff0c;以支持全部队列的正常消费的? Rebalance服务的类图 RebalanceImpl的核心属性 …

Springboot项目基础配置:小白也能快速上手!

推荐文章 给软件行业带来了春天——揭秘Spring究竟是何方神圣&#xff08;一&#xff09; 给软件行业带来了春天——揭秘Spring究竟是何方神圣&#xff08;二&#xff09; 给软件行业带来了春天——揭秘Spring究竟是何方神圣&#xff08;三&#xff09; 给软件行业带来了春天—…

Windows IIS服务如何配置并制作web站点结合内网穿透实现公网访问

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户端4.1 连接WebDav服务器4.2 连接成功4.2 连接成功总结&#xff1a; 自己用Windows Server搭建了家用NAS主机&…

【思科】 GRE VPN 的实验配置

【思科】GRE VPN 的实验配置 前言报文格式 实验需求配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN &#xff1a;&#xff08;Virtual Private Network&#xff09;&#xff0c;即“虚拟专…

系统架构17 - 软件工程(5)

软件工程 软件测试测试原则测试方法静态测试动态测试黑盒测试白盒测试灰盒测试自动化测试 测试阶段单元测试集成测试系统测试性能测试验收测试其它测试AB测试Web测试链接测试表单测试 测试用例设计黑盒测试用例白盒测试用例 调试 系统维护遗留系统系统转换转换方式数据转换与迁…

虹科干货 | 如何使用nProbe Cento构建100 Gbit NetFlow 传感器

本文是一份全面的指南&#xff0c;解释了如何使用nProbe Cento构建一个高效的100 Gbit NetFlow传感器。旨在帮助大家充分利用NetFlow技术&#xff0c;以监控和分析高速网络流量。 当需要监控分布式网络&#xff0c;了解流经上行链路或关键网段的网络流量时&#xff0c;NetFlow…

个人建站前端篇(一)项目准备初始化以及远程仓库连接

云风的知识库 云风网前端重构&#xff0c;采用vue3.0vite antd框架&#xff0c;实现前后端分离&#xff0c;实现网站的SEO优化&#xff0c;实现网站的性能优化 vite创建vue项目以及前期准备 Vite 需要 Node.js 版本 18&#xff0c;20。然而&#xff0c;有些模板需要依赖更高…

Arduino Uno R3通过ESP-01S连接网络

一、材料准备 Arduino Uno R3开发板 1 USB串口通信数据线&#xff08;Uno开发板使用&#xff09; 1 ESP8266-01S Wi-Fi模块 1 ESP8266固件烧录下载器&#xff08;烧录固件使用&#xff09; 1 WiFi无线收发转接板&#xff08;适用于ESP-01S、ESP-01&#xff09; 杜邦线…

京津冀科技盛会:2024北京国际智能科技产业展会(世亚智博会)

随着中国经济的快速发展&#xff0c;我们已逐渐从高速增长阶段转向高质量发展阶段。这一转变不仅是经济发展的必然趋势&#xff0c;也是全面建设社会主义现代化国家的首要任务。在这个过程中&#xff0c;数字经济以其高创新性、强渗透性和广覆盖性的特点&#xff0c;成为了构建…

《Docker技术革命:从虚拟机到容器化,全面解析Docker的原理与应用-上篇》

文章目录 Docker为什么会出现总结 Docker的思想Docker历史总结 Docker能干嘛虚拟机技术虚拟机技术的缺点 容器化技术Docker和虚拟机技术的区别 Docker概念Docker的基本组成镜像&#xff08;image)容器&#xff08;container&#xff09;仓科&#xff08;repository&#xff09;…

怎样做好Code Review

Code Review方案 定义 Code Review代码评审是指在软件开发过程中&#xff0c;通过对源代码进行系统性检查的过程。通常的目的是查找各种缺陷&#xff0c;包括代码缺陷、功能实现问题、编码合理性、性能优化等&#xff1b;保证软件总体质量和提高开发者自身水平 code review …

AI绘画探索人工智能的未来

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-8fL64RHWVzwpzR6m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

C++引用、内联函数、auto关键字介绍以及C++中无法使用NULL的原因

文章目录 一、引用1.1 引用概念1.2 引用特性1.3 常引用1.4 使用场景1.4.1 做参数1.4.2做返回值 1.5 引用和指针的区别1.6 小结一下 二、内联函数2.1 内联的概念2.2 内联的特性2.3 【面试题】 三、auto关键字(C11)3.1 类型别名思考3.2 auto简介 四、auto的使用细则4.1 基于范围的…

海外短剧系统国际短剧源码h5多语言版app挂载tiktok油管ins

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目 前言 一、海外短剧系统是什么&#xff1f; 二、海外短剧系统功能与运营方式介绍 1.系统功能 2.短剧APP运营方式 总结 前言 本文简单介绍海外短剧系统的功能&#xff…

leetcode hot100跳跃游戏Ⅱ

本题和上一题还是有不一样的地方&#xff0c;这个题中&#xff0c;我们需要记录我们跳跃的步数并尽可能的满足最小的跳跃步数到达终点。 那么我们还是采用覆盖范围的概念&#xff0c;但是我们需要两个&#xff0c;一个是在当前位置的覆盖范围&#xff0c;另一个是下一步的覆盖…

SpringCloud Gateway(4.1.0) 返回503:原因分析与解决方案

文章目录 一、环境版本二、原因分析三、解决方案 一、环境版本 Versionspring-cloud-dependencies2023.0.0spring-cloud-starter-gateway4.1.0Nacosv2.3.0 二、原因分析 在 Spring Cloud Gateway 的早期版本中&#xff0c;Ribbon 被用作默认的负载均衡器。随着Spring Cloud的…

Windows 7 x64 SP1 安装 Google Chrome 109.0.5414.120 (正式版本) (64 位)

1 使用 IE 浏览器 输入网址 Google Chrome 网络浏览器得益于 Google 智能工具&#xff0c;Chrome 现在更易用、更安全、更快速。https://www.google.cn/chrome/&#xff0c;点击下载 Chrome。 2 点击 接受并安装。 3 提示。 4 保存。 5 双击 运行 ChromeSetup.exe。 6 等待安…