当前位置: 首页 > 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]# 

相关文章:

  • nacos和redis本地启动
  • 黑群晖Moments视频无缩略图,安装第三方ffmpeg解决
  • 搭建PCDN大节点,服务器该怎么配
  • 企业微信jdk 授权 记录
  • SVTAV1源码-set_all_ref_frame_type
  • Mysql之数据库基础
  • 用TCP实现服务器与客户端的交互
  • python爬虫基础:requests库详解与案例
  • Microsoft Entra ID 免费版管理云资源详解
  • Vue:el-table-tree懒加载数据
  • Kaggle比赛入门攻略(以 Titanic 为例)
  • 【KWDB 创作者计划】_深度解析KWDB存储引擎
  • C++负载均衡远程调用学习之基础TCP服务
  • 如何做表征对齐?
  • 艺术与科技的双向奔赴——高一鑫荣获加州联合表彰
  • C# 类的基本概念(从类的内部访问成员和从类的外部访问成员)
  • PXI总线开关卡80个交叉点组成的中密度 PXI矩阵开关模块
  • WPF框架中常用算法
  • BT137-ASEMI机器人功率器件专用BT137
  • 【论文阅读】APMSA: Adversarial Perturbation Against Model Stealing Attacks
  • 新片|《我仍在此》定档5月,《新·驯龙高手》同步北美上映
  • 秦洪看盘|上市公司业绩“排雷”近尾声,A股下行压力趋缓
  • 五一“拼假”催热超长假期,热门酒店民宿一房难求
  • 证券时报:“好房子”标准即将全面落地,购房者有哪些新期待
  • 太好玩了!坐进大卫·霍克尼的敞篷车穿越他画笔下的四季
  • 俄罗斯总统普京:5月8日零时至11日零时实施停火