shell脚本-函数及数组

一.函数

1.函数的作用

  • 语句块定义成函数约等于别名,定义函数,再引用函数

  • 封装的可重复利用的具有特定功能的代码

2.函数的基本格式

法一:
[function] 函数名 {
	命令序列
	[return x]         #使用return或者exit可以显式的结束函数
}
 
法二:
函数名(){
	命令序列
}

法三:
function  函数名 (){
    命令序列
}

3.函数的注意事项

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

  2. 同名函数  后一个生效

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

  4. 每个函数是独立

4. 函数的调用方法

也可以先写一个函数仓库,脚本相当于去调用它

1.5 查看函数列表

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

1.6 函数的返回值

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

  • 函数的使用原则

    • 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;

    • 退出状态码必须是0~255,超出时值将为除以256取余

1.7 函数的传参

在 shell 中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。

输入参数的顺序就是位置参数的顺序,在里面调用相当于是固定外面的位置参数顺序

1.8 删除函数

unset  函数名     删除函数名

1.9 函数的范围

  • 函数在 shell 脚本中仅在当前 shell 环境中有效

  • shell 脚本中变量默认全局有效

  • 将变量限定在函数内部使用 local 命令

1.10 递归

函数调用自己本身的函数

必须要有结束函数的语句,防止死循环

① for 循环写

#!/bin/bash

sum=1
read -p "请输入一个数字:" num
for i in `seq $num`
do
let sum=$[i*sum]
done
echo $sum

② 用函数写

#!/bin/bash

fact () {

if [  $1 -eq  1  ]
then
echo 1
else
local temp=$[$1-1]
local result=`fact $temp`
echo "$[$1 * result]"

fi
}

fact $1

二.数组

1. 数组的定义

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

  • 数组元素的下标由 0 开始。

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

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

变量和数组

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

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

数组名和索引

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

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

下标不连续的,称为稀疏格式

2. 定义数组的方法

法一:


数组名=(value1 value2 ... valuen)


[root@localhost data03]#a=(1 2 3 4 5)
[root@localhost data03]#echo ${a[@]}
1 2 3 4 5

法二:

数组名=([0]=value0 [1]=value0 [2]=value0 ...)

[root@localhost data03]#x=([0]=1 [1]=2 [2]=3 [3]=4 [4]=5)
[root@localhost data03]#echo ${x[@]}
1 2 3 4 5

法三:

数组名[0]="value"
数组名[1]="value"
数组名[2]="value"

[root@localhost data03]#c[0]=1
[root@localhost data03]#c[1]=2
[root@localhost data03]#c[2]=3
[root@localhost data03]#c[3]=4
[root@localhost data03]#echo ${c[@]}
1 2 3 4

法四:

read  -a  数组名   #交互
输入内容

[root@localhost data03]#read -a num
10 20 30 40 50
[root@localhost data03]#echo ${num[@]}
10 20 30 40 50

3. 声明数组

#普通数组可以不事先声明,直接使用
declare  -a  数组名

#关联数组必须先声明,再使用
declare  -A  数组名

4.数组的数据类型

  • 数值类型

  • 字符类型:使用" "或’ '定义

5.获取数组的数据列表

echo ${数组名[*]}
echo ${数组名[@]}

6.获取数据长度

echo ${#数组名[*]} 
echo ${#数组名[@]} 
echo ${!数组名[@]}  #显示下标


echo ${数组名[索引值]}			输出数组索引值对应的元素,索引值为从0开始

7.数组的常用操作

7.1 数组的遍历

对数组所有元素进行访问,根据需要对所需要的元素进行操作

#!/bin/bash

a=(10 20 30 40 50)
for i in ${a[@]}
do
  echo $i
done

7.2 数组切片

用 : 进行操作

7.3 数组替换

格式:

${数组名[@]/查找字符/替换字符}

要实现改变原有数组,可通过重新复制实现

7.4 数组删除

7.5 取出数组中的最大值和最小值

最大值

#!/bin/bash
read -p "请输入数组:" num
a=($num)
max=${a[0]}
l=${#a[@]}
for ((i=0;i<$l;i++))
do
if [[ $max -lt ${a[$i+1]}  ]]
then
max=${a[$i+1]}
fi
done
echo $max

最小值

#!/bin/bash

read -p "请输入数组" num
a=($num)
min=${a[0]}
for ((i=0;i<${#a[@]}-1;i++))
do
if [[ $min -ge ${a[$i+1]} ]]
then
min=${a[$i+1]}
fi
done
echo "最小值是$min"

最大最小值

#!/bin/bash
for i in {0..9}
do
  a[$i]=$RANDOM
   [ $i -eq 0  ] &&  min=${a[0]}  &&  max=${a[0]}
   [ ${a[$i]} -gt  $max   ] && max=${a[$i]}
   [ ${a[$i]} -lt  $min   ] && min=${a[$i]}
done

echo  ${a[@]}

echo max=$max
echo min=$min

8.冒泡排序

#!/bin/bash

for i in {0..9}
do
  a[$i]=$RANDOM
done

l=${#a[@]}
for ((i=1;i<l;i++))
do
  for  ((j=0;j<l-i;j++))
  do
   first=${a[$j]}
   k=$[j+1]
   second=${a[$k]}
   if  [[ $first -gt $second ]]
   then
   temp=$first
   a[$j]=$second
   a[$k]=$temp
   fi
  done
done

echo ${a[@]}

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

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

相关文章

最新计算机软件毕业设计选题大全

最新计算机软件毕业设计选题大全 1、毕业设计选题 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff0c;阿里云开发社区乘风者计划专家博主&#xff0c;CSDN平台Java领域优质创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️ 主要项目&#xff1a;小…

【Spring源码分析】循环依赖的底层源码剖析

循环依赖的底层源码剖析 一、预知知识二、循环依赖的底层源码剖析1. Spring 是如何存储半成品Bean的&#xff1f;getEarlyBeanReference 方法的源码分析 2. Spring 是如何解决的循环依赖呢&#xff1f;测试 3. 哪些循环依赖 Spring 是无法解决的呢&#xff1f;Async 引起的循环…

cocos creator 调用预设体Prefab中的方法(调用另一个节点的方法)

调用预设体中的方法 通过cc.instantiate(this.star)创建这个预设体实例这个star预设体中添加了一个脚本组件star.ts 获取到这个脚本组件star.getComponent(‘star’).test()&#xff0c;并调用其中的test()方法同理可以用该方式像另一个节点中传值 //星星预设体property(cc.Pr…

用户故事 | 以低代码之名,打造业务与IT协同新模式

关键发现&#xff1a; 客户痛点&#xff1a;对于一个人人关注创新的企业而言&#xff0c;业务团队从不缺乏创意&#xff0c;困扰他们的往往在于是否有一个工具&#xff0c;可以最高效地让创意变为现实。 解决方案&#xff1a;使用MENDIX低代码平台&#xff0c;在IT团队的支持下…

WebService的services.xml问题

WebService有多种实现方式&#xff0c;这里使用的是axis2 问题&#xff1a; 在本地开发&#xff0c;访问本地的http://localhost:8080/services/ims?wsdl&#xff0c;正常访问 但是打成jar包&#xff0c;不管是linux还是window启动&#xff0c;都访问不到&#xff0c;报错…

维护管理Harbor,docker容器的重启策略

维护管理Harbor 通过HarborWeb创建项目 在 Harbor 仓库中&#xff0c;任何镜像在被 push 到 regsitry 之前都必须有一个自己所属的项目。 单击“项目”&#xff0c;填写项目名称&#xff0c;项目级别若设置为"私有"&#xff0c;则不勾选。如果设置为公共仓库&#…

【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 归并排序 代码实现&#xf…

Matplotlib应用-股票技术分析实战

MACD Moving Average Convergence/Divergence&#xff0c;意为异同移动平均线。它刻画的是股价变化的速度 MACD算法 指标含义公式短期EMA短期收盘价指数移动均线(12天)前一日EMA(12)11/13 今日收盘价2/13长期EMA长期收盘价指数移动均线(26天)前一日EMA(26)25/27 今日收盘价2…

qt5-入门-组件布局

参考&#xff1a; Qt学习之路_w3cschool 本地环境&#xff1a; win10专业版&#xff0c;64位 组件布局 绝对定位&#xff1a;给出确切的坐标值和尺寸&#xff0c;缺点是当用户改变窗口大小时&#xff0c;需要写函数响应变化&#xff08;或者禁止用户改变大小&#xff09; 布…

openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错

文章目录 openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错210.1 谓词下推引起的查询报错210.1.1 问题现象210.1.2 原因分析210.1.3 处理办法 openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错 210.…

Likeshop社区团购源码系统-社区团购更加便捷

一、什么是社区团购&#xff1f; 社区团购是一种基于社区的一种团购模式&#xff0c;依托于社区居民的消费需求&#xff0c;由社区团长组织发起&#xff0c;通过集中采购、批量销售的方式&#xff0c;为社区居民提供优质、优惠的商品。这种模式既满足了消费者对于优惠、便捷的…

Unity 观察者模式(实例详解)

文章目录 简介示例1 - 简单的文本更新通知示例2 - 多观察者监听游戏分数变化示例3 - 事件系统实现观察者模式示例4 - 泛型观察者和可序列化的事件系统示例5 - 使用C#委托简化版 简介 在Unity中实现观察者模式&#xff0c;我们可以创建一个Subject&#xff08;目标/主题&#x…

Redis -- 背景知识

目录 特性 为啥Redis快? 应用场景 Redis不能做什么&#xff1f; Redis是在内存中存储数据的一个中间件&#xff0c;用作为数据库&#xff0c;也可以用作为缓存&#xff0c;在分布式中有很高的威望。 特性 In-memory data structures&#xff1a;在内存中存储数据key-val…

微信开放平台第三方授权(第三篇)-获取auth_access_token

1.AuthAcsessToken的获取 继续上文&#xff0c;上文提到了想要发送消息&#xff0c;就要获取授权单独的authtoken&#xff0c;通过这个token才能调用微信发送消息接口。有六个步骤&#xff0c;少一步也获取不到这个authaccesstoken。 Token生成说明 | 微信开放文档 这里需要…

SV-8003V 网络寻呼话筒

SV-8003V是深圳锐科达电子有限公司的一款桌面式对讲主机SV-8003V同样作为广播对讲系统的核心组成部分&#xff0c;集成有全区广播、分区广播、单点呼叫、点对点对讲、以及监听等功能。SV-8003V使用铝合金拉丝面板&#xff0c;并配有高性能的鹅颈麦克风以及高保真的全频喇叭&…

Linux(CentOS7)与用户电脑传输文件(sz与rz)云与云(scp)

rz和sz是Linux/Unix同Windows进行Zmodem文件传输的命令工具 rz和sz中的z为Zmodem文件传输协议的首字母 s为send发送 r为receive接收&#xff0c;都是相对与Linux来看的接收和发送 Linux发送文件到电脑&#xff1a; sz命令 把文件发送到Windows sz 文件直接按回车就可以选择发送…

亚信安慧AntDB:AntDB-M元数据锁(五)

IS_DESTROYED: 标识锁对象将被释放。 HAS_OBTRUSIVE&#xff1a;标识锁对象下有obtrusive锁&#xff0c;新的锁申请必须进入慢速申请路径&#xff0c;释放锁时&#xff0c;也要先加锁以保护已授予锁链表。 HAS_SLOW_PATH: 标识锁对象下是否有unobtrusive锁。 5.3.2 干扰型(o…

船舶船体结构型面/曲面精度一致性三维检测海船提取结构几何参数

船舶船体结构型面三维扫描测量是一种高科技的测量方法&#xff0c;它利用三维激光扫描仪对船体表面进行高精度测量&#xff0c;以获取船体结构型面的三维数据。这种测量方法在船舶设计和制造中具有重要意义&#xff0c;可以为船舶工程师提供精确的数据支持&#xff0c;帮助他们…

《HTML 简易速速上手小册》第8章:HTML 表单高级技术(2024 最新版)

文章目录 8.1 数据收集与处理8.1.1 基础知识8.1.2 案例 1&#xff1a;创建一个注册表单8.1.3 案例 2&#xff1a;创建一个调查问卷表单8.1.4 案例 3&#xff1a;创建一个动态添加输入字段的表单 8.2 定制化表单元素8.2.1 基础知识8.2.2 案例 1&#xff1a;创建一个带有定制选择…

【Java】Lombok的使用

一、Lombok是什么&#xff1f; Lombok是一个Java库&#xff0c;能自动插入编辑器并构建工具&#xff0c;简化Java开发。通过添加注解的方式&#xff0c;不需要为类编写getter或eques方法&#xff0c;同时可以自动化日志变量&#x1f680; 在我们封装一个类时&#xff0c;最常用…