目录
1.什么叫函数
函数,脚本的别名
使用函数可以避免代码重复,增加可读性
1.函数的定义
基本格式
1.函数名 () {
脚本
}
2.function 函数名 () {
脚本
}
3.function 函数名{
}
直接写 函数中调用函数 直接写函数名
同名函数 后一个生效
调用函数一定要先定义
每个函数是独立
2查看函数
查看函数列表
declare -F
查看函数具体的定义
declare -f
判断操作系统版本
cat /etc/os-release
3.删除函数
unset 函数名
4.函数的返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
原则
函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
退出码必须是0-255,超出的值将为除以256取余
如果使用函数,那么$?使用就会受限,我们可以使用return自定义$?的返回值
写一个倍数的脚本
vim cg.sh
#!/bin/bash
test1 () {
read -p "请输入一个数字:" num
return $[$num*2]
}
test1
echo $?
5.函数的传参数
函数变量的作用范围:
函数在shell脚本中仅在当前的shell环境中有效
shell脚本中函数的变量默认全局有效
将变量限定在函数内部使用local命令
函数的传递参数要注意
脚本的$1 $2
函数的$1 $2
是没有关系的
函数的 $1 $2 是指跟在函数后面的值
范例:
vim dd.sh
#!/bin/bash
myfun(){
i=8
echo $i
}
myfun
i=9
echo $i
6.使用函数文件
新建一个专门放函数的文件
vim wenjian.sh
ostype (){
if grep -i -q "linux 7" /etc/os-release
then
echo "centos7"
fi
}
7.函数递归
函数调用自己本身的函数
for循环
#!/bin/bash
sum=1
read -p "请输入一个数字:" num
for i in `seq $num`
do
let sum=$[i*sum]
done
echo $sum
阶乘
vim ff
#!/bin/bash
fact () {
if [ $1 -eq 1 ]
then
echo 1
else
echo $[$1*`fact $[$1-1]`]
fi
}fact $1
2.数组
数组
普通数组:下标是数字
关联数组:下标是有含义的字符串
变量:储存单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的集合
数组的使用
一点要声明数组
declare -a 普通数组(不需要手动声明,系统帮你申明了)
declare -A 数组名 关联数组一定要手动声明
定义数组格式
1.数组名:(数组值(中间用空格隔开)) 一次性赋值
2.数组名[下标1]=值1 一次一次赋值
数组名[下标2]=值2
..............................
数组名[下标n]=值n
例子
a=(10 20 30 40 50)
调用数组
echo ${a[0]} 调用第一个值
echo ${a[1]} 调用第二个值
..........................................
echo ${a[3]} 调用第三个值
全部调用
echo ${a[@]}
echo ${a[*]}
显示数组的值的个数
echo ${#a[@]}
echo ${#a[*]}
显示所有下标
echo ${a[@]}
数据切片
a=(10 20 30 40 50)
echo ${a[@]:2:2}
跳过前两个 往后取两个
冒泡排序
a=(20 90 60 40 100)
轮次 总个数 需要比较的数 比几次 找到的数
第1轮 5 5个数 比4次 找到最大数
第2轮 5 4个数 比3次 找到第二大数
第3轮 5 3个数 比2次 找到第三大的数
第4轮 5 2个数 比1次 找到第四大的数
双重循环
第一轮
内循环比较相邻数的大小 找到最大数 5-17
第二轮
内循环比较相邻数的大小 找到最大数 5-2
第三轮
内循环比较相邻数的大小 找到最大数 5-3
............................................................5-4
排列组合
vim mp.sh
#!/bin/bash #生成一个随机数组
for i in {0..9}
do
a[$i]=$RANDOM
done
echo "原始数组为: ${a[@]}"
l=${#a[@]}
#定义变量l为数组a的长度10
for((i=1;i<$l;i++))
#需要比较的轮次
do
for ((j=0;j<$l-$i;j++))
#相邻的数需 要比较的次数
do
first=${a[$j]}
#数组的第一个数
k=$[$j+1]
#计算数组 下一个数的 下标
second=${a[$k]}
#下一个数
if [ $first -gt $second ]
then
temp=$first
a[$j]=$second
a[$k]=$temp
fi
done
done
echo "排序后的数组: ${a[@]}"