shell 脚本的函数和数组
函数
—— 封装的一个公式:sin、cos、tan
—— 函数为脚本的别名
—— 函数就是一个功能模块,在函数中写执行的命令即可;使用函数可以避免代码重复,增加可读性,简化脚本,使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强
—— 函数由函数名和函数体组成
—— 函数一定要先定义,才能使用
—— 帮助:help function
函数的用法
注:一定要先给函数定义,才能执行函数
查看函数
declare 命令
—— declare -F :查看函数列表
—— declare -f __函数名 :查找指定函数名;两个下划线

函数的定义
—— 格式1:自定义函数名 () {
脚本;命令序列
}
—— 格式2:function 自定义函数名 {
脚本;命令序列
}
—— 格式3:function 自定义函数名 (){
脚本;命令序列
}
例
格式1 #一般用此格式
[root@localhost opt]# han () { echo "hello"; }
#定义一个函数 han 为标准输出 hello
[root@localhost opt]# han
hello #执行此函数,显示结果格式2
[root@localhost opt]# function han { echo "hello"; }
[root@localhost opt]# han
hello格式3
[root@localhost opt]# function han () { echo "hello"; }
[root@localhost opt]# han
hello
删除函数
unset 命令
—— unset 函数名
例
#先定义一个函数,并验证是否能使用
[root@localhost opt]# han () { echo "hello"; }
[root@localhost opt]# han
hello[root@localhost opt]# unset han #删除函数
[root@localhost opt]# han
bash: han: 未找到命令...
#再次使用函数,验证是否删除;删除成功
定义函数变量的作用范围
local
—— 加此关键词,可以固定函数的变量范围,使其只能在函数内运行
export
—— 让子shell 继承变量
例
[root@localhost opt]# name=吴彦祖 #定义一个变量name为吴彦祖
[root@localhost opt]# echo $name #验证
吴彦祖
[root@localhost opt]# id () { name=彭于晏;echo $name; }
#定义一个函数id,让其中变量name输出结果为彭于晏
[root@localhost opt]# id #验证
彭于晏
[root@localhost opt]# echo $name
彭于晏#此时输出变量name已经被函数id所影响
[root@localhost opt]# unset id
[root@localhost opt]# echo $name
彭于晏
#就算删除函数id,变量name已经被更改
[root@localhost opt]# name=吴彦祖 #重新定义name
[root@localhost opt]# echo $name #验证
吴彦祖
[root@localhost opt]# id () { local name=彭于晏;echo $name; }
#使用命令 local,限制变量参数,使其只能在函数中执行
[root@localhost opt]# id #验证
彭于晏
[root@localhost opt]# echo $name #验证,此时变量name不会被函数id影响
吴彦祖
函数的返回值
return
—— 自定义 返回值 0 -- 255
—— 如果使用函数,那么 $? 那么使用就会受限,可以使用 return 自定义 $? 的返回值,来判断函数中的命令是否成功
—— 函数一结束就取返回值,因为 $? 变量只返回执行的最后一条命令的退出返回码
—— 退出码必须是0-255,超出的值将为除以256取余
例
[root@localhost opt]# text () { echo "hello"; }
#定义一个函数
[root@localhost opt]# text
hello
[root@localhost opt]# echo $?
0
#此时返回值为0
[root@localhost opt]# text () { echo "hello";return 250; }
#更改返回值为250
[root@localhost opt]# text
hello
[root@localhost opt]# echo $?
250
#此时返回值已经被更改为250
函数的传递参
脚本
#!/bin/bash
sum () {
echo " $1 " #识别第一个字符串
echo " $2 " #识别第二个字符串
#识别两个字符串
}
sum $2 $1
#这后面的$2和$1,代表的是跟在脚本后面的字符串的顺序;此处就是设定将第二个字符串放在第一位,将第一个字符串放在第二位显示结果
[root@localhost opt]# bash j.sh 1 99 1
需要注意
—— 脚本的 $1 $2 和函数的 $1 $2 ,是没有关系的
—— 函数的 $1 $2 是指跟在函数后面的值
递归函数
—— 函数的本质就是一个程序,每开一个进程都会消耗资源,无限的开自己死循环就会造成资源的无限占用形成病毒
—— 函数调用自己本身的函数
—— 必须要有结束函数的语句,防止死循环
阶乘函数
—— 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0和1的阶乘为1,自然数n的
—— 阶乘写作 n! =1×2×3×...×n
—— 阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n n!=n(n-1)(n-2)...1 n(n-1)! = n(n-1)(n-2)!
脚本举例:此脚本作用是计算任意数值的阶乘
#!/bin/bash
fact () {
if [ $1 -eq 0 -o $1 -eq 1 ]
thenecho 1
elseecho $[$1* $(fact $[$1-1])]
#这里将 $[$1-1] 的值再次使用函数 fact 进行执行
#此处 * 为乘
fi
}
fact $1结果展示
[root@localhost opt]# bash digui.sh 5
120
#5的阶乘为120
函数的文件
—— 专门存放函数的文件
—— . 绝对路径的文件名 函数名:从存放函数的文件中,提取使用指定函数(. 可以用 source 代替)
数组
—— 数据的集合称为数组
-
普通数组,普通数组可以不事先声明,直接使用;下标只能是数值
-
关联数组,关联数组必须先声明,再使用;下标可以自定义任意字符串
-
变量:存储单个元素的内存空间
-
数组:存储多个元素的连续的内存空间,相当于多个变量的集合
—— 数组名和索引
-
索引的编号从0开始,属于数值索引
-
索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持
-
bash的数组支持稀疏格式(索引不连续)
数组的使用
—— 一定要先声明数组
daclare -a 普通数组(不需要手动声明,系统帮你声明了)
—— 关联数组一定要手动声明
declare -A 数组名
定义数组
—— 自定义数组名=(数组值中间用空格隔开)
例
![]()
单个调用
| echo | 作用 |
|---|---|
| ${a[0]} | 调用第一个值 |
| ${a[1]} | 调用第二个值 |
| ${a[2]} | 调用第三个值 |
| …… | …… |
| ${a[n]} | 调用第n个值 |
全部调用
| echo | 作用 |
|---|---|
| ${a[@]} 或者 ${a[*]} | 显示所有结果 |
| ${#a[@]} 或者 ${#a[*]} | 统计个数 |
| ${!a[@]} 或者 ${!a[*]} | 显示所有下标 |
例

数组切片
—— 格式:echo ${自定义数组名[@或*]:自定义数字:自定义数字}
—— 注意:以 “:” 为分隔符
例
[root@localhost opt]# a=(1 2 3 4 5)
[root@localhost opt]# echo ${a[@]:1:3}
2 3 4
#从第一个开始并跳过第一个,到后三个结束
数组替换
—— 格式:echo ${自定义数组名[@或*]/查找的目标字符/替换的字符}
—— 注意:以 “/” 为分隔符
例
[root@localhost opt]# a=(1 2 3 4 5)
[root@localhost opt]# echo ${a[@]/2/hi}
1 hi 3 4 5
#查找a数组中第二个字符串,并替换成hi
数组删除
—— 格式:unset 数组名 //删除该数组
—— 格式:unset 数组名[n] //选择数组中的第 n 个删除;从0开始,0代表第一个字符
例
[root@localhost opt]# a=(1 2 3 4 5)
[root@localhost opt]# echo ${a[*]}
1 2 3 4 5
[root@localhost opt]# unset a[2] #删除该数组中第三个字符
[root@localhost opt]# echo ${a[*]} #验证
1 2 4 5
[root@localhost opt]# unset a #删除该数组
[root@localhost opt]# echo ${a[*]}
#不会显示任何东西
冒泡排序
—— 一种数组排序算法
—— 类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动
—— 基本思想:冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部
—— 算法思路:冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了,而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少
脚本举例:此脚本是随机生成十个不同的数字并进行从小到大排序
#!/bin/bash
for i in {0..9}
do
a[$i]=$RANDOM
done
#生成一个拥有十个随机数的数组
echo "原始数组: ${a[@]}"l=${#a[@]}
#定义变量l 等同于数组的总个数;此处 l=10
for((i=1;i<$l;i++))
#需要进行比较的次数
dofor ((j=0;j<$l-$i;j++))#相邻的数字,需要比较的次数dofirst=${a[$j]}#数组的第 n个数k=$[$j+1]#数组的 n+1大小的下标second=${a[$k]}#数组的第 n+1个数if [ $first -gt $second ]thentemp=$firsta[$j]=$seconda[$k]=$temp#该三行是将两个数字进行更换位置fidone
doneecho "从小到大: ${a[@]}"
脚本举例
比较随机数字的数组大小
#!/bin/bash
for a in {0..9}
dob[$a]=$RANDOM[ $a -eq 0 ] && min=${b[0]} && max=${b[0]}[ ${b[$a]} -gt $max ] && max=${b[$a]}[ ${b[$a]} -lt $min ] && min=${b[$a]}
doneecho "数组: ${b[*]}"
echo "最大值: $max"
echo "最小值: $min"
补充命令
scp 脚本名 目标ip
—— 将脚本发送给指定虚拟机
declare 命令补充
—— declare +/- 选项 变量名
| 选项 | 作用 |
|---|---|
| - | 赋予变量类型属性 |
| + | 取消变量的类型属性 |
| -a | 将变量声明为数组型 |
| -i | 将变量声明为整数型 |
| -x | 将变量声明为环境变量 |
| -r | 将变量声明为只读变量 |
| -p | 查看变量的被声明的类型 |
eval 命令
—— 格式:eval()
—— 注释:将任意字符串当成有效的表达式来求值并返回计算结果;如果参数不是字符串类型,则直接返回参数;需要注意的是,使用 eval() 函数时需要谨慎,因为它可以执行任意代码,存在一定的安全风险
显示颜色的命令

相关文章:
shell 脚本的函数和数组
函数 —— 封装的一个公式:sin、cos、tan —— 函数为脚本的别名 —— 函数就是一个功能模块,在函数中写执行的命令即可;使用函数可以避免代码重复,增加可读性,简化脚本,使用函数可以将大的工程分割为若…...
【RocketMq系列-02】RocketMq的架构解析和高性能设计
RocketMq系列整体栏目 内容链接地址【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709【二】RocketMq的架构解析和高性能设计/font>https://zhenghuisheng.blog.csdn.net/article/details/134559514 RocketMq的架构解析和高性能设…...
【数据结构/C++】线性表_单链表的基本操作
#include <iostream> using namespace std; // 2. 单链表 // ElemType 的定义 typedef int ElemType; typedef struct LNode {ElemType data;struct LNode *next; } LNode, *LinkList; // 初始化单链表 bool InitList(LinkList &L) {L (LNode *)malloc(sizeof(LNode…...
flink1.13.6版本的应用程序(maven版)
问题 想要一个指定flink版本的java计算任务hello world最简工程。 解决 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.13.6这里直接使用官方mave模版工程,指…...
深度学习之四(循环神经网络Recurrent Neural Networks,RNNs)
概念 循环神经网络(Recurrent Neural Networks,RNNs)是一类专门用于处理序列数据的神经网络,它在处理时考虑了序列数据的顺序和上下文信息。RNNs 在自然语言处理、时间序列分析、语音识别等领域得到广泛应用。 1. 基本结构: RNN 的基本结构包含一个或多个循环单元,每个…...
【论文精读】HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face
HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face 前言Abstract1 Introduction2 Related Works3 HuggingGPT3.1 Task PlanningSpecification-based InstructionDemonstration-based Parsing 3.2 Model SelectionIn-context Task-model Assignment 3…...
安装gitlab
安装gitlab 环境 关闭防火墙以及selinux,起码4核8G 内存至少 3G 不然启动不了 下载环境 gitlab官网:GitLab下载安装_GitLab最新中文基础版下载安装-极狐GitLab rpm包下载地址: [Yum - Nexus Repository Manager (gitlab.cn)](https://pack…...
Nginx模块开发之http handler实现流量统计(1)
文章目录 一、handler简介二、Nginx handler模块开发2.1、示例代码2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 三、Nginx的热更新总结 一、handler简介 Handler模块就是接受来自客户端的请求并产生输出的模块。 配置文件中使用location指令…...
JSP编写自己的第一个WebServlet实现客户端与服务端交互
我们在项目中找到java目录 下面有一个包路径 然后 我们在下面创建一个类 我这里叫 TransmissionTest 当然 名字是顺便取的 参考代码如下 package com.example.dom;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet…...
三、Keil安装芯片包、下载固件库、建立STM32工程模板
目录 一、首先在Keil软件上安装好芯片包 二、下载官方固件库 三、建立基于固件库的Keil5工程模板 一、首先在Keil软件上安装好芯片包 STM32有很多系列的芯片,我们平常用的最多的是STM32F1系列的,因此安装F1系列的芯片包在我们初学时,只按照…...
微信相框M1-03花屏抢救照片数据
故障现象 相册屏幕花屏,无法显示,拔掉电源黑屏(内部自带锂电池的) 问题排查 开始怀疑屏幕故障,拆开看到内部,发现是锂电池时间长鼓包后,顶到PCB,PCB板已经翘曲了,导致花…...
小程序可拖拽按钮
你有没有遇到过在页面中有一个固定在某个位置的按钮,永远的挡住了你想要看的区域? 在小程序的列表页面中,常常会有一个提报的入口固定在右下角,如果这个按钮不可拖动的话,可能会挡住下面的事件,让用户操作起…...
ARM裸机-19(NandFlash和iNand)
1、NandFlash的接口 1.1、Nand的型号与命名 (1)、Nand的型号命名都有含义,就拿K9F2G08来示例分析一下:K9F表示是三星公司的NandFlash系列。2G表示Nand的大小是2Gbit (256MB)。08表示Nand是8位的 (8位就是数据线有8根)。 (2)、Nand命名中可以看出&#x…...
机器学习/sklearn笔记:MeanShift
1 算法介绍 一种基于质心的算法通过更新候选质心使其成为给定区域内点的均值候选质心的位置是通过一种称为“爬山”技术迭代调整的,该技术找到估计的概率密度的局部最大值 1.1 基本形式 给定d维空间的n个数据点集X,那么对于空间中的任意点x的均值漂移…...
opencv-简单图像处理
图像像素存储形式 对于只有黑白颜色的灰度图,为单通道,一个像素块对应矩阵中一个数字,数值为0到255, 其中0表示最暗(黑色) ,255表示最亮(白色) 对于采用RGB模式的彩色图片&#…...
Linux(Kali\Ubuntu\CentOS\arm-Linux)安装Powershell
文章目录 Linux(Kali\Ubuntu\CentOS\arm-Linux)安装Powershell启动PowershellKaliUbuntuCentOSarm-Linux离线安装参考链接 Linux(Kali\Ubuntu\CentOS\arm-Linux)安装Powershell 启动Powershell pwshKali apt update && apt -y install powershellUbuntu # 更新包列…...
ubuntu20.04安装多版本cuda,切换版本
1. 安装cuda toolkit: 下载网站 https://developer.nvidia.com/cuda-11.3.0-download-archive 选择版本,这里选择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…...
网络渗透测试(wireshark 抓取QQ图片)
1.打开wireshark 这里我用的wifi连接 所以点开wifi就好 打开wifi之后就开始在本机上进行抓包了 我们先给我们的QQ发送一张图片,用自己的手机发送给电脑 然后点击左上角的正方形,停止捕获抓包 QQ的关键词是oicq,所以我们直接找 打开oicq …...
gRPC之gRPC负载均衡(客户端负载均衡)(etcd)
1、gRPC负载均衡(客户端负载均衡)(etcd) 本篇将基于etcd的服务发现前提下,介绍如何实现gRPC客户端负载均衡。 1.1 gRPC负载均衡 gRPC官方文档提供了关于gRPC负载均衡方案Load Balancing in gRPC https://github.com/grpc/grpc/blob/master/doc/load-balancing.m…...
语音识别技术paddlespeech的安装和使用
PaddleSpeech 介绍 PaddleSpeech是百度飞桨(PaddlePaddle)开源深度学习平台的其中一个项目,它基于飞桨的语音方向模型库,用于语音和音频中的各种关键任务的开发,包含大量基于深度学习前沿和有影响力的模型。PaddleSpe…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
