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]#