目录
一、函数
1.函数的由来
2.函数的作用
3.函数的使用方法
4.函数的定义
5.查看函数
6.删除函数
7.函数返回值
8.函数的传参数
9.函数递归
二、数组
1.数组的相关介绍
2.声明数组
3.定义数组的格式
4.冒泡排序
总结:本章主要介绍了函数和数组相关知识
在编写脚本时,有些脚本可以反复使用,可以调用函数来解决,脚本定义成函数类似于别名
函数的作用:避免脚本重复性,增加可读性,方便使用
先定义函数再引用函数
1.直接写 函数中调用函数 直接写函数名
2.同名函数 后一个生效
3.调用函数一定要先定义
4.每个函数是独立
基本格式
1.
function 函数名 {
命令序列
}
2.
函数名 () {
命令序列
}
3.
function 函数名 {
命令序列
}
例子:
declare -F 查看函数列表
declare -f 查看函数的具体定义
unset 函数名
return(自定义返回值)范围(0-255)超出时除以256取余
return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
使用原则:
函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
退出码必须是0-255,超出的值将为除以256取余
[root@localhost opt]# vim f.sh
[root@localhost opt]# bash f.sh
输入数字:8
16
#!/bin/bash
fc1 (){
read -p "输入数字:" s
return $[$s*2]
}
fc1
echo $?
函数的$1和$2是指跟在函数后面的值
脚本中的$1,$2和函数的$1,$2是没有关系的
[root@localhost data]# vim r.sh
[root@localhost data]# bash r.sh 2 3
2
3
#!/bin/bash
sum1 (){
echo $1
echo $2
}
sum1 $1 $2
函数变量的作用范围
local命令:只在内部有效对外部无效(局部变量)只对函数有效
name命令:普通变量
export命令:让子shell继承变量
如果加local关键字可以让变量只在函数中生效,不会影响外界函数的返回值
函数调用自己本身的函数(阶乘)
例:
5!=5*4*3*2*1=120
4!=4*3*2*1=24
#/bin/bash
fact () {
if [ $1 -eq 1 ]
then
echo "1"
else
r=$[$1*`fact $[$1-1]`]
echo $r
fi
}
fact $1
vim jc.sh
[root@localhost data]# bash jc.sh 3
6
[root@localhost data]# bash jc.sh 4
24
数组分为普通数组和关联数组
普通数组下标为数字
关联数组下标为有含义的字符串
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的集合
数组名和索引
索引的编号从0开始,属于数值索引
索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引
bash的数组支持稀疏格式(索引不连续)
使用数组需要先声明数组
普通数组: declare -a [数组名]
普通数组不需要手动声明,系统自动帮你声明
关联数组: declare -A [数组名]
关联数组一定要声明
定义数组格式:
1.数组名=(value0 value1 value2 value3 ......)
2.数组名=([0]=value [1]=value1 [2]=value2 ....)
3.列表名="value0 value1 value2 value3 ...... "
4.数组名=($列表名)
数组名[0]="value1"
数组名[1]="value2"
数组名[2]="value3"
数组的包括数据类型
数值型
字符型
混合型数值加字符
使用" "或' '定义单引号或双引号括起来
[root@localhost ~]# a=(10 20 30 40 50)
[root@localhost ~]# declare -a
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="0")'
declare -a a='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50")'
[root@localhost ~]# echo ${!a[*]}
0 1 2 3 4
[root@localhost ~]# echo ${a[0]}
10
[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]# echo ${#a[@]}
5
[root@localhost ~]# echo ${!a[@]}
0 1 2 3 4
[root@localhost ~]#
a=(10 20 30 40 50) 定义数组
declare -a 查看数组
echo ${!a[*]} 查看下标
echo ${a[0]} 查看数组中个体
echo ${!a[*]} 查看所有下标
echo ${a[@]} 查看数组中的所有个体
echo ${#a[@]} 查看数组的长度(个数)
echo ${!a[@]} 查看所有下标
*和@同义
数组分隔
echo ${a[@]:0:5}
[root@localhost ~]# echo ${a[@]:0:5}
10 20 30 40 50
[root@localhost ~]# echo ${a[@]:2:5}
30 40 50
[root@localhost ~]# echo ${a[@]:2:2}
30 40
[root@localhost ~]# echo ${a[@]:2:3}
30 40 50
[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]#
echo ${a[@]:0:5} 代表跳过前0个提取后5个
echo ${a[@]:2:2} 代表跳过前2个提取后2个
echo ${a[@]} 代表数组所有个体
[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]# echo ${a[1]}
20
[root@localhost ~]# a[1]=9
[root@localhost ~]# echo ${a[1]}
9
[root@localhost ~]# echo ${a[@]}
10 9 30 40 50
[root@localhost ~]#
a[1]=9 数组替换把原来的20换成了9
冒泡 是通过数字比较 将大的数往后排 小的数往前面排
5个数字 5-1=4 需要比较4轮 才能知道每一个数字的具体位置
a=(10 50 89 46 38)
轮次 总个数 需要比较的数 比几次 找到的数
第1轮 5 5个数 比4次 找到最大数
第2轮 5 4个数 比3次 找到第二大数
第3轮 5 3个数 比2次 找到第三大的数
第4轮 5 2个数 比1次 找到第四大的数
#!/bin/bash
a=(10 50 89 46 38)
for ((i=1;i<5;i++))
do
for ((j=0;j<5-$i;j++))
do
f=${a[$j]}
m=$[$j+1]
s=${a[$m]}
if [ $f -gt $s ]
then
q=$f
a[$j]=$s
a[$m]=$q
fi
done
done
echo "排序后的数组为${a[@]}"
[root@localhost data]# vim mpd.sh
[root@localhost data]# bash mpd.sh
排序后的数组为10 38 46 50 89
[root@localhost data]#