shell脚本-函数及数组

news2024/12/4 17:04:01

一.函数

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

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

相关文章

对比一下Confluence,其实HelpLook搭建知识库也不错

随着越来越多的企业转向远程工作和分散团队&#xff0c;寻找一种适合团队协作和知识共享的工具变得更为重要。HelpLook和Confluence是两个我认为比较相似的知识库软件&#xff0c;它们都提供了丰富的功能和卓越的用户体验。接下来就对HelpLook和Confluence进行详细的介绍和对比…

【Spring 篇】MyBatis DAO层实现:数据之舞的精灵

欢迎来到MyBatis DAO层的神奇世界&#xff0c;这里将为你揭示DAO层的奥秘&#xff0c;让你成为数据之舞的精灵。无论你是初学者还是想要深入了解DAO层的开发者&#xff0c;这篇博客将引导你踏入MyBatis DAO层的王国&#xff0c;一探其中的精彩。 舞台1&#xff1a;DAO层的角色…

【大数据面试题】HBase面试题附答案

目录 1.介绍下HBase 2.HBase优缺点 3.介绍下的HBase的架构 4.HBase的读写缓存 5.在删除HBase中的一个数据的时候&#xff0c;它是立马就把数据删除掉了吗? 6.HBase中的二级索引 7.HBase的RegionServer宕机以后怎么恢复的? 8.HBase的一个region由哪些东西组成? 9.…

安科瑞电化学储能电能管理系统解决方案——安科瑞赵嘉敏

1 概述 在我国新型电力系统中&#xff0c;新能源装机容量逐年提高&#xff0c;但是新能源比如光伏发电、风力发电是不稳定的能源&#xff0c;所以要维持电网稳定&#xff0c;促进新能源发电的消纳&#xff0c;储能将成为至关重要的一环&#xff0c;是分布式光伏、风电等新能源消…

LeetCode 40.组合总和 II

组合总和 II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 方法一、回溯 由于题目要求解集…

第十九周周报

文章目录 摘要文献阅读DeepHuman: 3D Human Reconstruction from a Single Image(ICCV 2019)贡献摘要网络结构总结 PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization贡献摘要网络结构总结 Animated 3D human avatars from a single imag…

多项式乘法逆(p4238 NTT)

题目路径&#xff1a; https://www.luogu.com.cn/problem/P4238 思路&#xff1a; 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<cstring> #include<cmath> #include<ctime> #include&l…

有什么办法可以让模糊的老照片变清晰?这几个方法收藏好!

照片盒子里的老照片&#xff0c;宛如一扇陈旧的时光之门&#xff0c;等着我们去开启。那些尘封的记忆&#xff0c;似乎已经被时间遗忘&#xff0c;但当我们轻轻拂去尘埃&#xff0c;那些熟悉的画面便再次浮现在眼前。然而&#xff0c;岁月无情&#xff0c;这些宝贵的瞬间在时间…

node.js漏洞总结

js开发的web应用和php/Java最大的区别就是js可以通过查看源代码的方式查看到编写的代码&#xff0c;但是php/Java的不能看到&#xff0c;也就是说js开发的web网页相当于可以进行白盒测试。 流行的js框架有&#xff1a; 1. AngularJS 2. React JS 3. Vue 4. jQuery 5. Backbone…

Linux | makefile简单教程 | Makefile的工作原理

前言 在学习完了Linux的基本操作之后&#xff0c;我们知道在linux中编写代码&#xff0c;编译代码都是要手动gcc命令&#xff0c;来执行这串代码的。 但是我们难道在以后运行代码的时候&#xff0c;难道都要自己敲gcc命令嘛&#xff1f;这是不是有点太烦了&#xff1f; 在vs中…

Docker安装多个nginx容器时,要注意端口设置:

Docker安装多个nginx容器时&#xff0c;要注意端口设置&#xff1a; docker run -id --namemynginx4 -p 8089:80 nginx 安装多个nginx容器时&#xff0c;要注意端口设置&#xff1a;宿主机80端口已经被暂用&#xff0c;所以宿主机端口一定不能设置位80&#xff0c;但是容器上80…

Vulnhub靶场DC-7

本机192.168.223.128 目标192.168.223.136 主机发现 nmap -sP 192.168.223.0/24 端口发现 nmap -sV -p- -A 192.168.223.136 开启了22 80端口 80端口apache服务 先进入web界面看一下 提示&#xff1a;DC7加了一些新的东西&#xff0c;让我看看盒子之外的东西&#xff0c;与…

C++ 利用容器适配器,仿函数实现栈,队列,优先级队列(堆),反向迭代器,deque的介绍与底层

C 利用容器适配器,仿函数实现栈,队列,优先级队列【堆】,反向迭代器,deque的介绍与底层 一.容器适配器的介绍二.利用容器适配器实现栈和队列1.stack2.queue 三.仿函数介绍1.什么是仿函数2.仿函数的使用3.函数指针的使用1.函数指针的用处2.利用函数指针完成回调3.利用仿函数完成回…

docker 体验怀旧游戏(魂斗罗等)

docker run --restart always -p 8081:80 --name fc-games -d registry.cn-hangzhou.aliyuncs.com/bystart/fc-games:latest ip:8081访问 jsnes: js制作了一个网页版的NES模拟&#xff0c;可以在网页上玩fc游戏 (gitee.com)

创建第一个 Spring 项目(IDEA社区版)

文章目录 创建 Spring 项目创建一个普通的 Maven 项目添加 Spring 依赖IDEA更换国内源 运行第一个 Spring 项目新建启动类存储 Bean 对象将Bean注册到Spring 获取并使用 Bean 对象 创建 Spring 项目 创建一个普通的 Maven 项目 首先创建一个普通的 Maven 项目 添加 Spring 依…

Tomcat好帮手---JDK

目录 1、Tomcat好帮手---JDK 2、安装JDK 部署Tomcat参考博主博客 部署TOMCAT详解-CSDN博客 1、Tomcat好帮手---JDK JDK是 Java 语言的软件开发工具包&#xff0c;JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA…

2024年新提出的算法:一种新的基于数学的优化算法——牛顿-拉夫森优化算法|Newton-Raphson-based optimizer,NRBO

1、简介 开发了一种新的元启发式算法——Newton-Raphson-Based优化器&#xff08;NRBO&#xff09;。NRBO受到Newton-Raphson方法的启发&#xff0c;它使用两个规则&#xff1a;Newton-Raphson搜索规则&#xff08;NRSR&#xff09;和Trap Avoidance算子&#xff08;TAO&#…

视频压缩怎么才能保持画质清晰?这样设置参数~

很多时候我们都需要压缩视频&#xff0c;但在减小视频大小的时候我们也会担心画质清晰度问题&#xff0c;那怎么既能压缩视频大小&#xff0c;又能保证视频清晰度呢&#xff1f;下面就来了解下吧~ 视频压缩分为无损压缩和有损压缩&#xff0c;如果想保持画质清晰&#xff0c;可…

[C#]winform部署yolov5实例分割模型onnx

【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 YOLOv5实例分割是目标检测算法的一个变种&#xff0c;主要用于识别和分割图像中的多个物体。它是在YOLOv5的基础上&#xff0c;通过添加一个实例分割模块来实现的。 在实例分割中&#xff0c;算法不仅…

spring-boot redis stream消息队列demo-及死信简单处理

Redis stream 是 Redis 5 引入的一种新的数据结构&#xff0c;它是一个高性能、高可靠性的消息队列&#xff0c;主要用于异步消息处理和流式数据处理。在此之前&#xff0c;想要使用 Redis 实现消息队列&#xff0c;通常可以使用例如&#xff1a;列表&#xff0c;有序集合、发布…