目录
一、函数
1.1 函数的定义
函数定义:封装的可重复利用的具有特定功能的代码
1.2 函数的三种格式
1.
function 函数名 {
命令序列
}
2.
函数名(){
命令序列
}
3.
function func_name () {
...函数体...
}
注意事项
- 直接写 函数中调用函数 直接写函数名
- 同名函数 后一个生效
- 调用函数一定要先定义
- 只要先定义了调用的 其他函数定义顺序无关
1.3 如何使用函数
1.定义
2.使用
准备一个只存函数的文件
函数一定要先定义 后使用
1.4 函数的调用
例子:查看当前操作系统的版本
#定义函数
#!/bin/bash
os (){
if grep -iq centos /etc/os-release
then echo "该系统是centos"
elif grep -iq ubuntu /etc/os-release
then echo "该系统是ubuntu"
else
echo "该系统既不是centos 也不是ubuntu"
fi
}
#调用函数
os
1.5 函数的返回值
如果 使用函数 那么 $? 使用就会受限
我们可以使用 return 自定义 $? 的返回值,来判断 函数中的 命令是否成功
使用原则:
函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
退出状态码必须是0~255,超出时值将为除以256取余
解决大于255的方法:
1.6 函数的传参数
例子:
#!/bin/bash
sum1(){
echo $1
echo $2
}
sum1 $2 $1
1.7 函数变量的 作用范围
加 local关键字 可以让变量只在函数中生效,不会影响外界环境
#!/bin/bash
fun(){
local i=10
echo $i
}
i=25
fun
echo $i
1.8 函数的递归
函数调用自己本身的函数
例子:阶乘
#!/bin/bash
fact () {
if [ $1 -eq 1 ]
then
echo 1
else
echo $[$1*`fact $[$1-1]`]
fi
}
fact $1
二、数组
2.1 数组的定义
数组:存储多个元素的连续的内存空间,相当于多个变量的数据集合 1对多
数组名和索引
-
索引的编号从0开始,属于数值索引
-
索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持
-
bash的数组支持稀疏格式(索引不连续)
2.2 数组的使用
注:一定要先声明数组
declare -a 普通数组(不需要手动声明)
关联数组一定要手动声明
declare -A 数组名
2.3 数组的格式
数组名=(value0 value1 value2 value3 ......)
数组名=([0]=value [1]=value1 [2]=value2 ....)
列表名="value0 value1 value2 value3 ...... "
数组名=($列表名)
数组名[0]="value1"
数组名[1]="value2"
数组名[2]="value3"
2.4 数组的数据类型
- 数值型
- 字符型
- 混合型数值加字符
- 使用" "或' '定义单引号或双引号括起来
2.5 数组的长度与内容以及如何获取数组下标对应的值
长度:
echo ${#数组名[*]}
echo ${#数组名[@]}
内容:
echo ${数组名[*]}
echo ${数组名[@]}
获取下标对应的值:
数组名=(元素0 元素1 元素2 ……) #定义数组
echo ${数组名[索引值]} # 输出数组索引值对应的元素,索引值为从0开始
2.6 数组中的应用
1.遍历数组
#!/bin/bash
a=(1 2 4 6 7 8 10)
for i in ${a[@]}
do
echo $i
done
2.数组的切片
${数组名[@]:offset:number}
offset #要跳过的元素个数
number #要取出的元素个数
3.数组删除和指定下标的值删除
#删除整个数组
unset 数组名
#删除指定下标的值
unset 数组名[数组下标]
4.取出最大值与最小值
#!/bin/bash
for i in {0..9}
do
a[$i]=$RANDOM
[ $i -eq 0 ]&& min=${a[0]} &&max=${a[0]}
[ ${a[$i]} -gt $max ]&& max=${a[$i]}
[ ${a[$i]} -lt $min ]&& min=${a[$i]}
done
echo "数组所有值为 ${a[@]}"
echo "最大值是:$max"
echo "最小值是:$min"
5.冒泡排序
#!/bin/bash
#生成一个随机数组
for i in {0..9}
do
a[$i]=$RANDOM
done
echo "原始数组为: ${a[@]}"
l=${#a[@]}
#定义变量l(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[@]}"