shell(函数和数组)

目录

一、函数

1.函数的由来

2.函数的作用

3.函数的使用方法

4.函数的定义

5.查看函数

6.删除函数

7.函数返回值

8.函数的传参数

9.函数递归

二、数组

1.数组的相关介绍

2.声明数组

3.定义数组的格式

4.冒泡排序

总结:本章主要介绍了函数和数组相关知识


一、函数

1.函数的由来

在编写脚本时,有些脚本可以反复使用,可以调用函数来解决,脚本定义成函数类似于别名

2.函数的作用

函数的作用:避免脚本重复性,增加可读性,方便使用

3.函数的使用方法

先定义函数再引用函数

1.直接写 函数中调用函数 直接写函数名

2.同名函数 后一个生效

3.调用函数一定要先定义

4.每个函数是独立

4.函数的定义

基本格式

1.

function 函数名 {

命令序列

}

2.

函数名 () {

命令序列

}

3.

function 函数名 {

命令序列

}

例子:

5.查看函数

declare -F   查看函数列表

declare -f    查看函数的具体定义

6.删除函数

unset 函数名

7.函数返回值

return(自定义返回值)范围(0-255)超出时除以256取余

return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值

使用原则:

  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码

  2. 退出码必须是0-255,超出的值将为除以256取余

[root@localhost opt]# vim f.sh
[root@localhost opt]# bash f.sh
输入数字:8
16
#!/bin/bash
fc1 (){
read -p "输入数字:" s
return $[$s*2]
}
fc1
echo $?

8.函数的传参数

函数的$1和$2是指跟在函数后面的值

脚本中的$1,$2和函数的$1,$2是没有关系的

[root@localhost data]# vim r.sh
[root@localhost data]# bash r.sh 2 3
2
3

#!/bin/bash
sum1 (){
echo $1
echo $2
}
sum1 $1 $2

函数变量的作用范围

local命令:只在内部有效对外部无效(局部变量)只对函数有效

name命令:普通变量

export命令:让子shell继承变量

如果加local关键字可以让变量只在函数中生效,不会影响外界函数的返回值

9.函数递归

函数调用自己本身的函数(阶乘)

例:

5!=5*4*3*2*1=120

4!=4*3*2*1=24

#/bin/bash
fact () {
  if [ $1 -eq 1 ]
  then
  echo "1"
  else
  r=$[$1*`fact $[$1-1]`]
  echo $r
  fi
}
fact $1

vim jc.sh
[root@localhost data]# bash jc.sh 3
6
[root@localhost data]# bash jc.sh 4
24

二、数组

1.数组的相关介绍

数组分为普通数组和关联数组

普通数组下标为数字

关联数组下标为有含义的字符串

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

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

数组名和索引

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

索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引

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

2.声明数组

使用数组需要先声明数组

普通数组:                          declare -a [数组名]

普通数组不需要手动声明,系统自动帮你声明

关联数组:                          declare -A [数组名]

关联数组一定要声明

3.定义数组的格式

定义数组格式:

1.数组名=(value0 value1 value2 value3 ......)

2.数组名=([0]=value [1]=value1 [2]=value2 ....)

3.列表名="value0 value1 value2 value3 ...... "

4.数组名=($列表名)

数组名[0]="value1"

数组名[1]="value2"

数组名[2]="value3"

数组的包括数据类型

数值型

字符型

混合型数值加字符

使用" "或' '定义单引号或双引号括起来

[root@localhost ~]# a=(10 20 30 40 50)
[root@localhost ~]# declare -a
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="0")'
declare -a a='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50")'
[root@localhost ~]# echo ${!a[*]}
0 1 2 3 4
[root@localhost ~]# echo ${a[0]}
10
[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]# echo ${#a[@]}
5
[root@localhost ~]# echo ${!a[@]}
0 1 2 3 4
[root@localhost ~]# 

a=(10 20 30 40 50) 定义数组

declare -a  查看数组

 echo ${!a[*]}  查看下标

echo ${a[0]}  查看数组中个体

echo ${!a[*]}  查看所有下标

echo ${a[@]}  查看数组中的所有个体

echo ${#a[@]}   查看数组的长度(个数)

echo ${!a[@]}   查看所有下标

*和@同义

数组分隔

echo ${a[@]:0:5}

[root@localhost ~]# echo ${a[@]:0:5}
10 20 30 40 50
[root@localhost ~]# echo ${a[@]:2:5}
30 40 50
[root@localhost ~]# echo ${a[@]:2:2}
30 40
[root@localhost ~]# echo ${a[@]:2:3}
30 40 50
[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]# 

echo ${a[@]:0:5}  代表跳过前0个提取后5个

echo ${a[@]:2:2} 代表跳过前2个提取后2个

echo ${a[@]}  代表数组所有个体

[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]# echo ${a[1]}
20
[root@localhost ~]# a[1]=9
[root@localhost ~]# echo ${a[1]}
9
[root@localhost ~]# echo ${a[@]}
10 9 30 40 50
[root@localhost ~]# 

a[1]=9 数组替换把原来的20换成了9

4.冒泡排序

冒泡   是通过数字比较 将大的数往后排  小的数往前面排
5个数字 5-1=4  需要比较4轮  才能知道每一个数字的具体位置
a=(10 50 89 46 38) 
轮次  总个数   需要比较的数  比几次     找到的数
第1轮  5      5个数        比4次     找到最大数    
第2轮  5      4个数        比3次     找到第二大数  
第3轮  5      3个数        比2次     找到第三大的数
第4轮  5      2个数        比1次     找到第四大的数

#!/bin/bash
a=(10 50 89 46 38)
for ((i=1;i<5;i++))
do
  for ((j=0;j<5-$i;j++))
  do
  f=${a[$j]}
  m=$[$j+1]
  s=${a[$m]}
  if [ $f -gt $s ]
  then
  q=$f
  a[$j]=$s
  a[$m]=$q
  fi
  done
done
echo "排序后的数组为${a[@]}"

[root@localhost data]# vim mpd.sh
[root@localhost data]# bash mpd.sh
排序后的数组为10 38 46 50 89
[root@localhost data]# 

总结:本章主要介绍了函数和数组相关知识

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

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

相关文章

gRPC之gRPC负载均衡(客户端负载均衡)(etcd)

1、gRPC负载均衡(客户端负载均衡)(etcd) 本篇将基于etcd的服务发现前提下&#xff0c;介绍如何实现gRPC客户端负载均衡。 1.1 gRPC负载均衡 gRPC官方文档提供了关于gRPC负载均衡方案Load Balancing in gRPC https://github.com/grpc/grpc/blob/master/doc/load-balancing.m…

【操作系统】Bochs安装和配置

Bochs是使用C编写的高度可移植开源IA-32&#xff08;X86&#xff09;PC模拟器&#xff0c;能在大多数流行的平台上运行。它包括模拟Intel x86 CPU、常见I/O设备和自定义BIOS。Bochs可以被编译以模拟许多不同的x86 CPU&#xff0c;从386早期到最新的x86-64英特尔和AMD处理器甚至…

【UE】用样条线实现测距功能(下)

目录 效果 步骤 一、实现多次测距功能 二、通过控件蓝图来进行测距 在上一篇&#xff08;【UE】用样条线实现测距功能&#xff08;上&#xff09;&#xff09;文章基础上继续实现多次测距和清除功能。 效果 步骤 一、实现多次测距功能 打开蓝图“BP_Spline”&#xff0c…

RTOS的任务触发底层逻辑

&#xff08;定时器用于计时和触发事件&#xff0c;任务则由调度器进行调度和执行&#xff1a;每当时钟节拍到达时&#xff0c;系统会触发一个称为 tick 中断的事件。当 tick 中断发生时&#xff0c;操作系统会在中断服务例程中执行一定的处理&#xff0c;其中包括更新任务的运…

MySQL的Redo Log跟Binlog

文章目录 概要Redo Log日志Redo Log的作用Redo Log的写入机制 Binlog日志Binlog的作用Binlog写入机制 两段提交 概要 Redo Log和Binlog是MySQL日志系统中非常重要的两种机制&#xff0c;也有很多相似之处&#xff0c;本文主要介绍两者细节和区别。 Redo Log日志 Redo Log的作…

JMeter压测常见面试问题

1、JMeter可以模拟哪些类型的负载&#xff1f; JMeter可以模拟各种类型的负载&#xff0c;包括但不限于Web应用程序、API、数据库、FTP、SMTP、JMS、SOAP / RESTful Web服务等。这使得JMeter成为一个功能强大且灵活的压力测试工具。 2、如何配置JMeter来进行分布式压力测试&a…

保护你的APP!快速了解如何进行APP安全性测试!

通常我们队APP所进行的安全性测试包含以下几个模块&#xff1a;安装包安全性、数据安全性、软键盘劫持、账户安全性、通信安全性、备份检查等。下面针对每个模块我们详细说明具体的测试方法。 安装包安全性 1、反编译 目的是为了保护公司的知识产权和安全方面的考虑等&#x…

Appium 全新 2.0 全新跨平台生态,版本特性抢鲜体验!

关于Appium V2 Appium V2 beta版本在2021年发布&#xff0c;从2022年1月1号开始&#xff0c;Appium核心团队不会再维护Appium 1.x版本了&#xff0c;所有近期官方发布的平台驱动&#xff08;如Android平台的UIAutomator&#xff0c;IOS平台的XCUITest&#xff09;不再兼容Appi…

相比其他关系型数据库,AntDB JDBC驱动特性有哪些不同之处

摘要&#xff1a;使用Java语言进行各类应用程序的快速开发成为目前比较主要且流行的开发方式。JDBC是 Java 语言中用来连接和操作关系型数据库的 API&#xff0c;在业务程序与关系型数据库通信时&#xff0c;必然会使用JDBC驱动。 本文将通过国产关系型数据库AntDB中的JDBC为大…

在PCL视图器中使用随机生成的颜色来可视化一组匹配的点对

std::vector<Eigen::Vector2d> centroids_unknown_motion_underk; std::vector<Eigen::Vector2d> centroids_unknown_motion_k; // 进行数字填充 pcl::visualization::PCLVisualizer viewer("Centroid Visualization");int id 0;// 添加 XY 坐标系doub…

中国人总爱乱吃药,这些家庭常见药我劝你别乱吃!

你可能在各种抖音快手上都看到过博主推荐生活小窍门—— 比如巧用二甲双胍减肥&#xff0c;六味地黄丸包治百病&#xff0c;阿司匹林巧治高血压…… 世上本没有神药&#xff0c;用得多了&#xff0c;也就变成神药了。 ——这句话鲁迅没说&#xff0c;也没有任何道理可言。 说…

uni-app开发小程序,利用scroll-view实现自动滚动至对应数据

uniapp scroll-view 官网 vue文件内容&#xff1a;dom: <scroll-view scroll-y :scroll-into-view"seqToView"><view class"pop-scroll"><viewv-for"(item,index) in seqList":id"seq- item":key"index"cl…

ubuntu20.04安装多版本cuda,切换版本

1. 安装cuda toolkit: 下载网站 https://developer.nvidia.com/cuda-11.3.0-download-archive 选择版本&#xff0c;这里选择11.3 wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run给cuda权限: chmod x…

数据结构与算法【红黑树】的Java实现+图解

前言 建议先阅读普通二叉搜索树与平衡二叉搜索树的文章。理解一些基本的二叉树知识数据结构与算法【二叉搜索树】Java实现-CSDN博客 介绍 红黑树也是一种自平衡的二叉搜索树&#xff0c;较之 AVL&#xff0c;插入和删除时旋转次数更少。 首先介绍代码实现会用到的概念 兄弟…

python-opencv在图片中绘制各种图形

python-opencv在图片中绘制各种图形 1.绘制直线 2.绘制矩形 3.绘制圆 4.绘制椭圆 5.绘制多边形 6.嵌入文字 实现代码都在下面了&#xff0c;代码中参数做了简单注释 import copy import math import matplotlib.pyplot as plt import matplotlib as mpl import numpy a…

OpenStack云计算平台-启动一个实例

目录 一、创建虚拟网络 ​二、创建m1.nano规格的主机 三、生成一个键值对 四、增加安全组规则 ​五、启动一个实例 1、确定实例选项 2、创建实例 3、使用虚拟控制台访问实例 4、验证能否远程访问实例 一、创建虚拟网络 下面的说明和框图使用示例IP 地址范围。你必须依…

单个视频生成视频二维码,手把手图文教程

单个视频生成视频二维码帮助教程&#xff08;图文教程&#xff09;&#xff0c;手把手教程如下&#xff1a; STEP1 注册帐号 使用视频二维码&#xff0c;您需要注册酷播云用户帐号&#xff08;免费5G空间&#xff0c;普通用户够用&#xff09;。 参考如图1-1&#xff0c;按照…

关于ElectronVue3中集成讯飞星火AI

前言&#xff1a;我的最终目的是为了在QQ上集成一个AI机器人&#xff0c;因此在这里先实现一个简单的集成 先上效果图 总体还是很简单的&#xff0c;我在调用websock获取回复内容的基础上另外集成了一个事件总线&#xff0c;让我们在调用获取消息的时候能够更加方便快捷 工具代…

前端学习--React(3)

一、Redux 集中状态管理工具&#xff0c;不需要react即可使用&#xff0c;每个store的数据都是独立于组件之外的 vue小链接&#xff1a;vuex/pinia 基本使用 Redux将数据修改流程分成三个概念&#xff0c;state、action和reducer state - 一个对象 存放我们管理的数据状态 a…

OpenStack云计算平台-镜像服务

目录 一、镜像服务概览 二、安装和配置 1、先决条件 2、安全并配置组件 3、完成安装 三、验证操作 一、镜像服务概览 OpenStack镜像服务是IaaS的核心服务&#xff0c;如同 :ref:get_started_conceptual_architecture所示。它接受磁盘镜像或服务器镜像API请求&#xff0c;…
最新文章