函数与数组

一.函数

1、函数的作用

定义较为复杂的但是需要重复使用的内容,以便再次使用,可以直接调用,节约时间,提高效率。

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

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

2、函数使用步骤

①首先是定义函数

②其次是调用函数(注意:若定义完成不调用则函数无效)

③查看系统限制所有函数:declare -F

④查看函数定义详细内容:declare -f 函数名

⑤删除函数:unset 函数名

3、定义函数基本格式

1.function  函数名 () {

函数内容

}

2.function 函数名 {

函数内容

}

3.函数名 () {

函数内容

} 

4.函数变量

作用范围
  • 函数在Shell脚本中仅在当前Shell环境中有效
  • Shell脚本中变量默认全局有效
  • 将变最限定在函数内部使用local命令
示例脚本1:Shell脚本中变量默认全局有效
#!/bin/bash
 
fun(){
 i=10
}
 
i=20
fun
echo $i
示例脚本2:将变量限定在函数内部使用local命令

5.函数的调用方法

示例脚本1:查看当前操作系统
#定义函数
#!/bin/bash
 
os (){
if  grep -i -q "CentOS Linux 7 " /etc/os-release
then 
 echo "此操作系统是centos 7"
 
 
elif  grep -i -q "CentOS Linux 6 " /etc/os-release
then 
 echo "此操作系统是centos 6"
 
elif  grep -i -q "CentOS Linux 8 " /etc/os-release
then 
 echo "此操作系统是centos 8"
fi
}
 
#调用函数
os
示例脚本2: 函数备份yum线上源,创建yum本地源和清理缓存安装httpd
#!/bin/bash
backups(){
cd /etc/yum.repos.d
mkdir repo.bak
mv *.repo repo.bak
mount /dev/sr0 /mnt >/dev/null
}
 
configuration(){
echo -e '[local]\nname=local\nbaseurl=file:///mnt\nenable=1\ngpgcheck=0' >/etc/yum.repos.d/local.repo
}
 
clean(){
yum clean all
yum makecache
yum install -y httpd > /dev/null
}
 
 
backups
configuration
clean

6.函数的返回值

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

使用原则 :

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

退出状态码必须是0~255,超出范围将除以256取余

如何解决大于255:

7.函数传参

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

示例脚本:

#!/bin/bash
sum () {
echo "第一个位置参数:" $1
echo "第二个位置参数:" $2
let n=$1+$2
echo $n
}
sum $2 $1

#!/bin/bash
sum () {
echo "第一个位置参数:" $1
echo "第二个位置参数:" $2
let n=$1+$2
echo $n
}
sum $1 $2

8.函数的递归

函数调用自己本身的函数

示例脚本1:阶乘

二.数组

1.数组定义

与大部分编程语言类似,数组元素的下标由 0 开始

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

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

2.数组分类

①关联数组:必须声明才可以使用,命令:delare -A 数组名

②普通数组:利用数字下标节约变量,可以不声明也可以声明,命令:delare -a 数组名

delare -a命令也可查看有哪些普通数组

3.数组的语法格式

格式一:
数组名=(value1 value2 ... valuen)
arr_number=(1 2 3 4 5 6 7 8 9)

格式二:
数组名=([0]=value0 [1]=value0 [2]=value0 ...)
arr_number=([0]=1 [1]=2 [2]=3 [3]=4)

格式三:
列表名:"value1 value2 valueN ..."
数组名=($列表名)
list_number="1 2 3 4 5 6"
arr_number=($list_number)

格式四:
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
arr_number[0]=1
arr_number[1]=2
arr_number[2]=3

4.数组的数据类型

  • 数值类型

  • 字符类型

  • 使用 " "(双引号) 或者 ' ' (单引号)定义

    #数组可以是数值型
    a=(1 2 3 4 5);echo ${a[@]}
    1 2 3 4 5

    #数组可以是混合型
    a=(a 1 2 apple);echo ${a[@]}
    a 1 2 apple

5. 获取数组的长度

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

6.获取数组下标对应的值

数组名=(元素0  元素1  元素2  ......)					定义数组
echo ${数组名[索引值]}							输出数组索引值对应的元素,索引值为从0开始

7.数组的常用操作

7.1 数组的遍历
#!/bin/bash
a=(1 2 3 4 5 6)
for i in ${a[@]}
do
   echo $i
done
7.2 数组切片
a=(0 1 2 3 4 5 6 7 8)
echo "输出整个数组: " ${a[@]}
echo "取出数组1到3: " ${a[@]:1:3}
echo "取出数组5到后面所有的元素: " ${a[@]:5:5}
7.3 数组替换
#临时替换
echo ${a[@]/原替换位置/替换内容} 
 
#重新赋值,可以永久修改
a=(${a[@]/原替换位置/替换内容})
7.4 数组删除和指定下标的值删除
#删除整个数组
unset 数组名
 
#删除指定下标的值
unset 数组名[数组下标]
7.5 数组追加元素

方法一:直接使用下标进行元素的追加

数组名[下标]=变量

方法二: 将数组的长度作为下标进行追加元素

数组名[${数组名[@]}]=变量名

方法三: 使用+=进行追加

数组名+=(变量1 变量2 ...)
7.6 declare -a: 查看所有数组

三.冒泡排序

#!/bin/bash
#排序之前的数组顺序
a=(10 40 33 30 77 66 44 ) 
#确定循环比较的次数
for ((j=1;j<${#a[@]};j++))
do
#对比获取每次的最大元素的索引位置
for ((i=0;i<${#a[@]}-j;i++))
do
#如果对比出最大元素,就把该元素赋值给后面的变量tmp
if  [ ${a[$i]} -gt ${a[$i+1]} ]
then
#定义一个变量tmp,将每次比较的最大数值放进tmp,实现变量对换
tmp=${a[$i+1]}
a[$i+1]=${a[$i]}
a[$i]=$tmp
fi
done
done
echo ${a[*]} 

补充

全部调用:echo ${a[@]}

echo ${a[*]}

echo ${#a[@]}:显示数组的值的个数

echo ${!a[@]}:显示所有下标

相关推荐
无为之士5 分钟前
Linux自动备份Mysql数据库
linux·数据库·mysql
秋名山小桃子15 分钟前
Kunlun 2280服务器(ARM)Raid卡磁盘盘符漂移问题解决
运维·服务器
与君共勉1213815 分钟前
Nginx 负载均衡的实现
运维·服务器·nginx·负载均衡
岑梓铭22 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
努力学习的小廉22 分钟前
深入了解Linux —— make和makefile自动化构建工具
linux·服务器·自动化
MZWeiei26 分钟前
Zookeeper基本命令解析
大数据·linux·运维·服务器·zookeeper
7yewh41 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
Arenaschi1 小时前
在Tomcat中部署应用时,如何通过域名访问而不加端口号
运维·服务器
小张认为的测试1 小时前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
waicsdn_haha1 小时前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk