当前位置: 首页 > news >正文

Sehll编程的函数于数组

目录

一、函数

1.1、定义函数

1.2、查看、删除函数

1.3、函数的返回值

1.4、函数的参数传递

1.5、函数的作用范围

1.6、函数递归

二、数组

2.1、声明数组

2.2、数组格式定义

2.3、数组调用

2.4、删除数组


一、函数

shell编程中,函数用于封装一段可以重复使用的代码,类似。可以在脚本的任何地方定义函数,且随时调用这些函数。

1.1、定义函数
//定义函数的三种格式
函数名 () {
command1
command2
}function 函数名 {
command1
command2
}function 函数名 () {
command1
command2
}
[root@localhost opt]# function time1(){ echo $(date +%F-%T); }    //定义函数
[root@localhost opt]# echo $(time1)                               //调用函数
2025-03-12-22:21:26[root@localhost opt]# vim newfunction.sh 
#!/bin/bashtime1(){                    //定义函数
echo `date +%F-%T`
}
time1                       //调用函数
[root@localhost opt]# . newfunction.sh     //.或source执行脚本,显示调用函数结果
2025-03-12-22:30:05
1.2、查看、删除函数

declare命令的功能时用于声明定义新的变量。由于该命令创建的变量为临时变量,切换shell或重启就会失效,所有只使用其 f 选项查看所有函数。

[root@localhost opt]# declare -f time1    //查看函数名及函数定义
time1 () 
{ echo $(date +%F-%T)
}
[root@localhost opt]# declare -F time1    //只显示函数名称
time1

unset命令是删除指定的shell变量或函数

[root@localhost opt]# unset time1
[root@localhost opt]# declare -f time1
[root@localhost opt]# 
1.3、函数的返回值

return用于函数内部,表示函数的退出状态,只能返回0-255的整数值,超过256的值会和256相除取余。ruturn后,函数的执行会停止,脚本中的其他代码继续执行。

  • 0:表示函数执行成功,且没有错误。
  • 非0:表示函数执行失败,具体的错误码表示不同类型的错误。
#!/bin/bash
# 定义一个函数,判断输入数字是否大于 10
check_number() {if [ $1 -gt 10 ];thenreturn 0  # 如果大于10,返回0表示成功elsereturn 1  # 如果小于等于10,返回1表示失败fi
}# 调用函数并处理返回值
check_number 15
if [ $? -eq 0 ];thenecho "15 大于 10."
elseecho "15 小于等于 10."
ficheck_number 5
if [ $? -eq 0 ];thenecho "5 大于 10."
elseecho "5 小于等于 10."
fi[root@localhost opt]# bash num1.sh 25
15 is greater than 10.
5 is less than or equal to 10.
1.4、函数的参数传递

在 Bash 中,函数的参数传递是通过位置参数来实现的。这些参数在函数内部通过$1,$2,$3等来访问。$1表示第一个传递给函数的参数,$2表示第二个,以此类推。

[root@localhost opt]# vim greet
#!/bin/bash
greet(){
echo $1
echo $2
}greet $2 $1[root@localhost opt]# bash greet.sh a b
b
a
1.5、函数的作用范围
[root@localhost ~]#name=aa
[root@localhost ~]#func1 () { name=bb ; echo $name; }
[root@localhost ~]#func1
bb
[root@localhost ~]#echo $name 
bb
[root@localhost ~]#name=aa;func1 () { local name=bb ;echo $name; };echo $name
//加上local变量即可将变量限制在函数内
aa
1.6、函数递归

即函数调用自己本身的函数

//阶乘
fact() {if [ $1 -eq 1 ]thenecho 1elselocal temp=$[$1 - 1]local result=$(fact $temp)echo $[$1 * $result]#  5 * $result(4*$result(3*$result(2*$result(1))))fi
}
read -p "请输入:" n
result=$(fact $n)
echo $result  //阶乘结果

二、数组

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

数组名和索引

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

  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持

  • bash的数组支持稀疏格式(索引不连续)

2.1、声明数组
//普通数组可以不事先声明,直接使用,系统会自动声明
declare -a ARRAY_NAME
//关联数组必须先声明,再使用
declare -A ARRAY_NAME
2.2、数组格式定义
//数组名=(value0  value1 value2 value3 ......)
[root@localhost ~]# a=(1 2 3 4 5)0 1 2 3 4    //通过下标值定义
//数组名=([0]=value   [1]=value1  [2]=value2 ....)
[root@localhost ~]#declare -a
declare -a a='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'
[root@localhost ~]# echo ${!a[*]}        //查看下标 
0 1 2 3 4
[root@localhost ~]# echo ${a[0]}         //数组的取值  数组加下标
1                                        //输出第一一个数值  注意是从0开始计算//先定义列表,再定义数组
//列表名="value0  value1 value2 value3 ...... "
//数组名=($列表名)
[root@localhost ~]#list="1 2 3 4 5"    //先定义列表
[root@localhost ~]#list1=($list)       //再定义数组
[root@localhost ~]#echo ${list1[@]}
1 2 3 4 5//单独赋值
数组名[0]="value1"
数组名[1]="value2"
数组名[2]="value3"
2.3、数组调用
//列出所有参数
[root@localhost ~]# echo ${a[*]}   //*代表所有参数
1 2 3 4 5
[root@localhost ~]# echo ${a[@]}   //@同*
1 2 3 4 5
//共有多少个位置
[root@localhost ~]# echo ${#a[@]}     //前面加#数组的长度
5
[root@localhost ~]# echo ${#a[*]}    
5
//数组分隔
[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ky15]#echo ${a[@]:0:5}
1 2 3 4 5
[root@localhost ky15]#a[1]=9
//数组替换
[root@localhost ky15]#echo ${a[1]}
9
[root@localhost ky15]#echo ${a[@]}
1 9 3 4 5
//数组切片:
${ARRAY[@]:offset:number}
offset //要跳过的元素个数
number //要取出的元素个数
//取偏移量之后的所有元素 
{ARRAY[@]:offset}[root@centos8 ~]#num=({0..10})
[root@centos8 ~]#echo ${num[*]:2:3}
2 3 4
[root@centos8 ~]#echo ${num[*]:6}
6 7 8 9 10
2.4、删除数组
//删除数组
unset 数组名
[root@localhost opt]# a=(1 2 3 4 5)
[root@localhost opt]# unset a
[root@localhost opt]# echo ${a[*]}[root@localhost opt]# 

http://www.xdnf.cn/news/225829.html

相关文章:

  • 深度解析:Vue.js 性能优化全景指南(从原理到实践)
  • micro-app前端微服务原理解析
  • JVM快速入门
  • ubuntu下一些环境配置
  • 自定义实现elementui的锚点
  • hadoop伪分布式模式
  • 【操作系统】进程和线程的区别
  • Dify 获取天气数据并以echarts图表显示
  • SPSS PCA+判别分析
  • Axure疑难杂症:全局变量跨页面赋值、中继器交互(玩转全局变量)
  • 4:QT联合HALCON编程—机器人二次程序抓取开发(九点标定)
  • [特殊字符] Spring Cloud 微服务配置统一管理:基于 Nacos 的最佳实践详解
  • windows远程服务器数据库的搭建和远程访问(Mysql忘记密码通过Navicat连接记录解密密码)
  • Android学习总结之设计场景题
  • 当插入排序遇上“凌波微步“——希尔排序的奇幻漂流
  • 单体项目到微服务的架构演变与K8s发展是否会代替微服务
  • 华为云汪维敏:AI赋能应用现代化,加速金融生产力跃升
  • “BYD SHENZHEN”启运,搭载超7000台比亚迪新能源车前往巴西
  • 金融风控的“天眼”:遥感技术的创新应用
  • H.264添加 SEI 信息技术文档
  • MySQL bin目录下的可执行文件
  • 零基础学Java——第八章:Java网络编程(下)
  • 数据资产管理与AI融合:物联网时代的新征程
  • 【KWDB 创作者计划】_存储引擎深度解析
  • 核心技能:ArcGIS洪水灾害普查、风险评估及淹没制图
  • MT6765 android上层获取VCM lens位置
  • macOS 安装了Docker Desktop版终端docker 命令没办法使用
  • ‌阿里云dns服务器不可用怎么办?dns可以随便改吗?
  • Dockerfile最佳实践:构建高效、安全的容器镜像
  • AI生成Flutter UI代码实践(一)