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 ]thenecho "1"elser=$[$1*`fact $[$1-1]`]echo $rfi
}
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++))
dofor ((j=0;j<5-$i;j++))dof=${a[$j]}m=$[$j+1]s=${a[$m]}if [ $f -gt $s ]thenq=$fa[$j]=$sa[$m]=$qfidone
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.mzph.cn/news/164494.shtml

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

相关文章

运维 在Windows上搭建小型Git服务

文章目录 1、Git选型1.1、主要特性1.2、代码管理1.3、工单管理1.4、Pull/Merge requests1.5、第三方集成1.6、选型结论 2、环境搭建2.1、Gitea下载2.2、Gitea安装2.3、配置服务信息2.4、运行服务2.5、注册Gitea为服务2.6、正常使用 1、Git选型 1.1、主要特性 1.2、代码管理 1.…

多数据库使用django-apscheduler时,migrate后并不能生成django_apscheduler_djangojob表的问题

先说一下django-apscheduler定时器的使用过程&#xff1a; django-apscheduler基本使用 1.安装django-apscheduler代码如下&#xff08;示例&#xff09;&#xff1a; pip install django-apscheduler 2.配置settings.py的INSTALLED_APPS代码如下&#xff08;示例&#xff09…

项目中常用的 19 条 SQL 优化宝典

一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引…

【CCF-PTA】第03届Scratch第01题 -- 梦醒时分

梦醒时分 【题目描述】 睡眠是人体正常的生理需要&#xff0c;同年龄男女睡眠时间无明显差别&#xff0c;一般是8小时左右。居家的小明作息生活很规律&#xff0c;晚上11点睡觉&#xff0c;早晨7点起床学习。请你编写程序来判断&#xff0c;每周&#xff08;共168小时&#x…

【JavaEE初阶】 JavaScript相应的WebAPI

文章目录 &#x1f332;WebAPI 背景知识&#x1f6a9;什么是 WebAPI&#x1f6a9;什么是 API &#x1f38d;DOM 基本概念&#x1f6a9;什么是 DOM&#x1f6a9;DOM 树 &#x1f340;获取元素&#x1f6a9;querySelector&#x1f6a9;querySelectorAll &#x1f384;事件初识&am…

不是吧?线程池这样搞?

其他系列文章目录 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 系列文章目录 前言 一、为什么需要线程池&#xff1f; 二、举个背景例子 三、怎么创建线程池&#xff1f; 四、线程池指定线程数 前言 学习线程池能够帮助我们更好地处理多线程编程&#xff0c;并提高程…

TikTok美区本土店铺如何做好IP隔离?

为什么要进行IP隔离呢&#xff1f;因为我们无法在国内直接运营Shopee、TikTok、Lazada等平台的本土店&#xff0c;平台识别出店铺登录IP非本土IP&#xff0c;则容易导致店铺风控、被标记为伪本土店&#xff0c;影响店铺经营。 TikTok美区店铺的IP隔离方法和Shopee本土店一致&a…

SpringMVC(二)

八、HttpMessageConverter HttpMessageConverter&#xff0c;报文信息转换器&#xff0c;将请求报文转换为Java对象&#xff0c;或将Java对象转换为响应报文 HttpMessageConverter提供了两个注解和两个类型&#xff1a;RequestBody&#xff0c;ResponseBody&#xff0c;Reque…

【MySQL】子查询

文章目录 子查询IN运算符子查询 VS 连接ALL关键字ANY关键字相关子查询 !EXISTS运算符select子句中的子查询from子句中的子查询 子查询 获取价格大于id为3的货物的商品 用到了内查询&#xff0c;获取id为3的商品的单价&#xff0c;把结构传给外查询 在where子句中编写子查询&am…

【python基础(四)】if语句详解

文章目录 一. 一个简单示例二. 条件测试1. 检查多个条件1.1. 使用and关联多个条件1.2. 使用or检查多个条件1.3. in的判断 2. 布尔表达式 三. if语句1. 简单的if语句2. if-else语句3. if-elif-else结构4. 使用多个elif代码块5. 省略else代码块 四. 使用if语句处理列表1. 检查特殊…

2023-11-23 LeetCode每日一题(HTML 实体解析器)

2023-11-23每日一题 一、题目编号 1410. HTML 实体解析器二、题目链接 点击跳转到题目位置 三、题目描述 「HTML 实体解析器」 是一种特殊的解析器&#xff0c;它将 HTML 代码作为输入&#xff0c;并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们…

Endnote软件添加期刊引用格式

在下述网址中&#xff0c;找到你想要添加的期刊&#xff0c;下载引用格式文件&#xff08;后缀为.ens格式&#xff09; https://endnote.com/downloads/styles/?wpv_post_searchInformationfusion&wpv_aux_current_post_id12829&wpv_view_count12764-TCPID12829 下载…

SQLY优化

insert优化 1.批量插入 手动事务提交 主键顺序插入&#xff0c;主键顺序插入性能高于乱序插入 2.大批量插入数据 如果一次性需要插入大批量数据&#xff0c;使用Insert语句插入性能较低&#xff0c;此时可以使用MYSQL数据库提供的load指令进行插入 主键优化 主键设计原则 …

Java实现王者荣耀小游戏

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造成基础伤害。小…

vue3 终端实现 (vue3+xterm+websocket)

目录 一、xterm介绍 二、效果展示 三、vue文件实现代码 一、xterm介绍 xterm是一个使用

【C++初阶】STL详解(七)Stack与Queue的模拟实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

力扣labuladong一刷day17天前缀和数组

力扣labuladong一刷day17天前缀和数组 一、303. 区域和检索 - 数组不可变 题目链接&#xff1a;https://leetcode.cn/problems/range-sum-query-immutable/ 思路&#xff1a;本题即为让写一个类用于计算指定区间内的数字和&#xff0c;但如果直接采用for循环的方式&#xff0…

Unity调用dll踩坑记

请用写一段代码&#xff0c;让unity无声无息的崩溃。 你说这怕是有点难哦&#xff0c;谁会这么不幸呢&#xff1f;不幸的是&#xff0c;我幸运的成为了那个不幸的人。 unity里面调用dll的方式是使用 DllImport &#xff0c;比如有一个 Hello.dll&#xff0c;里面有一个 char* …

图片如何去除水印?试试这三种去水印方法!

从事自媒体行业的小伙伴们&#xff0c;你们是否经常为文章配图而烦恼呢&#xff1f;下载的图片大部分带有各种各样的水印或者多余元素&#xff0c;让人感到困扰。今天&#xff0c;我要分享三个去水印的妙招&#xff0c;这是新媒体人必备的图片处理技能&#xff0c;快来一起学起…

【MATLAB源码-第87期】基于matlab的Q-learning算法栅格地图路径规划,自主选择起始点和障碍物。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Q-learning是一种无模型的强化学习算法&#xff0c;适用于有限的马尔可夫决策过程&#xff08;MDP&#xff09;。它的核心是学习一个动作价值函数&#xff08;action-value function&#xff09;&#xff0c;即Q函数&#xf…