目录
函数
把命令序列按照格式写在一起,命令序列可以重复使用
使用函数可以避免代码的重复
函数可以将大的工程分割成若干小的模块,可以提高代码的可读性。
函数的格式
格式一
function 函数名 {
命令序列
}
函数名 #调用函数
格式二
函数名 () {
命令序列
}
函数名 #调用函数
函数返回值
在 Shell 脚本中,return 语句用于指定函数的退出状态码(返回码)
1.表示退出函数并返回一个退出值,用$?可以显示这个值,退出值范围为0-255,超过255时会除以256取余
2.在shell脚本中,return的返回值默认就是0或者非0的返回码
return作用在函数内部,在shell中return一般就是判断涵数的执行情况
exit作用于整个脚本,立即终止,没有返回码,脚本立即停止运行。
exit 0 程序正常退出 非0程序是异常退出
函数传参
在shell中,调用函数可以传递参数,用位置变量来传参,在函数内部可以定义位置变量。:·
函数变量的作用范围
函数在shell中仅在当前的shell环境中有效
在函数中定义的变量默认为全局变量
实验
阶乘
计算输入值的阶乘
jiecheng () {
if [ $1 -eq 1 ]
then
echo "1"
else
local temp=$(($1-1))
local res=$(jiecheng $temp)
echo "$(($1*$res))"
fi
}
read -p "请输入阶乘数" n
res=`jiecheng $n`
echo $res
递归函数
函数调用自己本身的函数
递归查看目录与文件
dayin () {
for f in $(ls $1)
do
if [ -d "$1/$f" ]
then
echo "$f"
dayin "$1/$f"
else
echo "$f"
fi
done
}
read -p "输入目录绝对路径" n
file=`dayin $n`
echo "$file"
函数库
函数库中只包含函数的定义,脚本中包含调用函数的方法也可以有执行代码。
计算器使用函数库
函数库
jiafa () {
res=$(($1+$2))
echo $res
}
jianfa () {
res=$(($1-$2))
echo $res
}
chengfa () {
res=$(($1*$2))
echo $res
}
chufa () {
if [ $2 -ne 0 ]
then
res=$(($1/$2))
echo $res
else
echo"被除数不能为零"
fi
}
调用程序
. /opt/test
read -p "输入第一个数" num1
read -p "输入第二个数" num2
jia=`jiafa $num1 $num2`
jian=`jianfa $num1 $num2`
cheng=`jdhengfa $num1 $num2`
chu=`chufa $num1 $num2`
echo "$jia"
echo "$jian"
echo "$cheng"
echo "$chu"
数组
数组 数字组成的组,组里可以是int类型,string,字符串等,数组中的数据类型可以有用户自定义。既可以是同一种也可以是不同的数据类型组成的元素集合
数组的最大作用是可以一次性定义多个变量
shell中创建数组方法
方法一
shuzu=(aaa 123 www 555)
定义数组名称
() 定义数组的元素,多个元素由空格隔开
方法二
shuzu=([0]=aaa [1]=123 [2]=www)
[0][1][2] 表示数组的下标索引,数组中索引下标从0开始
方法三
shuzu [0]=aaa
shuzu [1]=123
shuzu [2]=www
命令
获取
获取对应元素下标的值
echo ${shuzu[1]}
获取数组包含所有元素
echo ${shuzu[*]}
echo ${shuzu[@]}
查看数组中含有元素数量
echo ${#shuzu[*]}
数组的遍历
sz1=(test test1 test2 test3 test4)
for user in ${sz1[*]}
do
useradd $user
read -p "输入${user}的密码" mima
echo "$mima" | passwd --stdin "$user"
done
数组的切片
sz=(test test1 test2 test3 test4)
echo ${sz[*]:0:2}
索引下标后面的步长,是从当前的索引下标的位置,包含自己的位置,往后走几位,这里指的都是索引位詈,不是对应的元素值
数组的替换
替换数组当中的元素
echo ${sz[*]/test2/tihuan} 临时替换,原数组的值不会修改
sz=(sz[*]/test2/tihuan) 永久替换,通过重新赋值来实现
删除整个数组
unset sz
删除数组中指定元素
unset sz[3]
通过索引下标的位置,删除数组中指定的元素
追加数组元素
方法一
sz[5]=test5
索引位置为空,可以是追加,如果索引位置有值就是替换
如果要追加元素,一般是按照索引下标的顺序来进行添加。
方法二
sz[${#sz[*]}]=test6
用的最多的方式
方式三
sz+=(test7 test8)
最简单的方式
数组的应用
数组与函数之间的应用
数组作为参数传给函数
seq 自动生成数字排序
seq 1 10 1-10
seq 1 2 10 1 3 5 7 9
seq 10 1 10-1
seq 10 -2 1 10 8 6 4 2
冒泡排序
面试会问
在数组当中从小到大或从大到小进行排序,就是把一个大小顺序混乱的数组排序。
冒泡排序思路
test=(20 10 60 40 50 30)
从小到大
两个相邻的数比大小,大的向右,小的向左
冒泡排序需要双循环
外循环确定次数
内循环比较大小,换位置
实现和循环次数的轮次而减少
实验
从大到小排列占用的内存大小
df -h
abc=(`df -h | awk 'NR>1 {print $5}' | tr -d "%"`)
echo "原占用的排列顺序为:${abc[*]}"
length=${#abc[*]}
for ((i=1;i<$length;i++))
do
for ((k=0;k<$[$length - $i];k++))
do
first=${abc[$k]}
j=$(($k+1))
second=$((abc[$j]))
if [[ $first -lt $second ]]
then
temp=$first
abc[$k]=$second
abc[$j]=$temp
fi
done
done
echo "排序后的占用顺序为:${abc[*]}