shell(函数和数组)

news2024/9/23 19:29:01

目录

一、函数

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.coloradmin.cn/o/1244342.html

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

相关文章

Redis集群主备切换原因排查

背景 线上redis部署的是三主三集群&#xff0c;昨天中午&#xff0c;线上各服务接连告警&#xff0c;提示服务已下线&#xff0c;过一段时间又上线了&#xff08;springboot-admin企业微信服务下线、上线告警&#xff09;&#xff0c;赶紧放下手中外卖排查。 排查 1. 查看各…

unreal 指定windows SDK

路径 &#xff1a; “C:\Users\Administrator\AppData\Roaming\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml” 在Configuration中添加 <WindowsPlatform><WindowsSdkVersion>10.0.20348.0</WindowsSdkVersion></WindowsPlatform>示例&…

什么是高防IP?如何进行防护?怎样隐藏源站?

高防IP是针对互联网服务器遭受大流量的DDoS攻击后导致服务不可用的情况下&#xff0c;推出的付费增值服务&#xff0c;是目前最常用的一种防御DDoS攻击的手段。用户在数据不转移的情况下&#xff0c;就可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;防护系…

objdump反汇编文件解析

命令使用 objdump可以对可执行文件进行反汇编 其常用参数为: objdump -d <file(s)>: 将代码段反汇编&#xff1b;objdump -S <file(s)>: 将代码段反汇编的同时&#xff0c;将反汇编代码与源代码交替显示&#xff0c;编译时需要使用-g参数&#xff0c;即需要调试信…

R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析

很久很久以前给大家写过决策树&#xff0c;非常简单明了的算法。今天给大家写随机&#xff08;生存&#xff09;森林&#xff0c;随机森林是集成了很多个决策数的集成模型。像随机森林这样将很多个基本学习器集合起来形成一个更加强大的学习器的这么一种集成思想还是非常好的。…

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SCN随机配置网络多变量回归预测 1.data为数据集&#xff0c;7个输入特征&#xff0…

二十、索引库

目录 一、Mapping属性 二、创建索引库 1、在DevTools中编写代码 2、运行并查看 三、查询索引库 1、查询索引库语法&#xff1a; 四、删除索引库 1、删除索引库语法 五、修改索引库 一、Mapping属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括:…

Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来 )

Jquery ajax 同步阻塞引起的UI线程阻塞的坑&#xff08;loading图片显示不出来&#xff0c;layer.load延迟&#xff09;jax重新获取数据刷新页面功能&#xff0c;因为ajax属于耗时操作&#xff0c;想在获取数据且加载页面时显示加载遮罩层&#xff0c;结果发现了ajax的好多坑。…

代码随想录算法训练营第五十二天|1143.最长公共子序列 1035.不相交的线 53. 最大子序和

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 1143.最长公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:dp [[0] * (len(text2) 1) for _ i…

Modbus故障码速查手册(故障码含义、分析原因、详细解读)

Modbus故障码速查手册 文章目录 Modbus故障码速查手册引言故障码表故障详解0x01 IllegalFunction0x02 IllegalDataAddress0x03 IllegalDataValue0x04 SlaveDeviceFailure0x05 Acknowledge0x06 SlaveDeviceBusy0x08 MemoryParityError0x0A GatewayPathUnavailable0x0B GatewayTa…

使用 PowerShell 中的命令来删除共享目录

Remove-SmbShare -Name "ShareName" 请将 "ShareName" 替换为您要删除的实际共享目录的名称。 请注意&#xff0c;执行此命令需要具有适当的权限。确保您以管理员身份运行 PowerShell 或具有足够的权限来删除共享目录。

【iOS】数据持久化(一)之Plist文件、Preference(NSUserDefaults类)

目录 什么是Plist文件&#xff1f;plist可以存储哪些数据类型plist文件数据的读取与存储 Perference&#xff08;NSUserDefaults&#xff09;使用方法registerDefaults: 方法的使用 什么是Plist文件&#xff1f; Plist文件&#xff08;属性列表&#xff09;是将某些特定的类&a…

Django(十、中间件)

文章目录 一、中间件的介绍中间件有什么用中间件功能自定义中间中间件的顺序 一、中间件的介绍 中间件顾名思义&#xff0c;是介于request与response处理之间的一道处理过程&#xff0c;相对比较轻量级&#xff0c;并且在全局上改变django的输入与输出。因为改变的是全局&…

每日一练 | 华为认证真题练习Day136

1、OSI参考模型从高层到低层分别是&#xff1f; A. 应用层、会话层、表示层、传输层、网络层、数据链路层、物理层 B. 应用层、传输层、网络层、数据链路层、物理层 C. 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 D. 应用层、表示层、会话层、网络层、传…

Android : ExpandableListView(折叠列表) +BaseExpandableListAdapter-简单应用

示例图&#xff1a; 实体类DemoData.java package com.example.myexpandablelistview.entity;public class DemoData {private String content;private int img;public DemoData(String content, int img) {this.content content;this.img img;}public String getContent()…

1999-2021年地级市城镇居民人均消费性支出数据

1999-2021年地级市城镇居民人均消费性支出数据 1、时间&#xff1a;1999-2021年 2、指标&#xff1a;城镇居民人均消费性支出 3、范围&#xff1a;290个地级市 4、来源&#xff1a;城市年鉴、地级市统计公报 5、指标解释&#xff1a; 城镇居民人均消费性支出&#xff1a;指…

SpringBoot 导入其他配置文件

默认情况下&#xff0c;springboot 初始的项目中都有一个 application.yml 或者 application.properties 文件&#xff0c;如果我们希望再定义一个独立的配置文件用来配置特定业务数据&#xff0c;而不希望把这些配置内容都堆积在 application 配置文件中&#xff0c;实现这个需…

微电子专业词汇汇总,芯片人必备!

在芯片行业&#xff0c;很多相关的技术术语都是用英文表述。在这里为大家整理了一些常用的微电子专业词汇&#xff0c;希望对大家有所帮助。&#xff08;文末可领全部文档&#xff09; Abrupt junction 突变结 Accelerated testing 加速实验 Acceptor 受主 Acceptor atom 受主…

PS 注释工具 基础使用方法讲解

好 上文PS 颜色取样器&标尺工具 基本使用讲解中 我们讲了 颜色取样器和标尺工具的基本用法 下面我们来看一下 注释工具 这个 主要是后面 比较大的作品 可能不是我们一个人取设计 团队作图 就需要用到它 选择 注释工具 后 我们随便点击图像任何一个位置 右侧就会出现一个输…

Python 如何开发出RESTful Web接口,DRF框架助力灵活实现!

Django Rest Framework&#xff08;DRF&#xff09;是构建强大且灵活的Web API的优秀工具。它基于Django&#xff0c;提供了一套用于构建Web API的组件和工具&#xff0c;简化了API开发过程&#xff0c;同时保留了Django的优雅和强大。 一、Web应用模式 在开发Web应用时&…