函数
函数和别名很像
有些脚本会被反复使用
alias 脚本比较复杂
函数 脚本的别名
使用函数可以避免代码重复,增加可读性,简化脚本
定义
函数名 () {
脚本
}
function 函数名 (){
脚本
}
先定义在调用
#!/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
#用“.”(source)不用bash
函数的返回值
加 local 关键字 可以让 变量 只在函数中生效,不会影响外部环境
local:只在函数内部生效,外部不生效
return:自定义返回值(0~255)
如果使用函数 那么 $?使用就会受限
我们可以使用return自定义$?的返回值,来判断 函数中的命令是否成功
#!/bin/bash user () { if [ $USER = root ] then echo "这是管理员用户" else echo "这不是管理员用户" return 1 fi } user
函数的传递参数
需要注意
脚本的$1 $2
函数的$1 $2
是没有关系的
函数的$1$2是指跟在函数后面的值
拓展:
阶乘:
#!/bin/bash fact () { if [ $1 -eq 1 ] then echo 1 else echo $[$1*`fact $[$1-1]`] fi } fact $1
#求5的阶乘结果 120
4的阶乘结果 *5
3的阶乘结果 *4
2的阶乘结果 *3
1的阶乘结果 *2
1的阶乘结果是 1
#一个正整数的阶乘,是所有小于及等于该数的正整数的积,并且0和1的阶乘为1,自然数n的阶乘写作n!
n!=1✖2✖3✖...✖n
阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n
垃圾回收站:
#!/bin/bash DIR=`mktemp -d /tmp/trash-$(date +%F_%H-%M-%S)XXXXXX` mv $* $DIR echo $* is move to $DIR alias rm=/data/ljz.sh
#将目录中不需要的文件用这个脚本删除,会在/tmp/这个目录下创建一个删除当成的日期、时间结尾为6个随机字符的文件夹,并收入
数组
数据的集合称为数组
普通数组:下标是数子
关联数组:下标是有含义的字符串
变量:存储单个元素的内存空间 一 一对应
数组:存储多个元素的连续的内存空间,相当于多个变量的数据集合 一对多
数组名和索引下标
- 索引的编号从0开始,属于数值索引
- 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引
- bash的数组支持稀疏格式(索引可以不连续)
在使用数组前,先声明
declare -a 普通数组 (不需要手动 声明,系统帮你声明)
关联数组一定要手动声明
declare -A 数组名
定义数组的方法
1、数组名=(数组值 ,中间用空格隔开)
2、数组名[下标1]=值1
数组名[下标2]=值2
.......
数组名[下标n]=值n
例子 a=(10 20 30 40 50) 调用数组(单个调用) echo ${a[0]} 10 echo ${a[1]} 20 echo ${a[2]} 30 ... 全部调用 echo ${a[@]} 10 20 30 40 50 echo ${a[*]} 10 20 30 40 50 显示数组的值的个数 echo ${#a[@]} 显示数组的下标的个数 echo ${!a[@]} 删除数组 unset 数组名
关联数组
例子: declare -A f f[name]=cjw f[home]=js f[people]=4
数组切片
a= (10 20 30 40 50)
echo ${a[@]:2:2} 他的结果是30 40
跳过前两个,再往后取两个值
如何遍历数组
a=(zs lisi ww jj) for i in ${a[@]} do echo $i done r=`echo $[RANDOM%38]` echo ${a[$r]}
最大值和最小值
#!/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
# 随机生成10个数,从中选出最大值和最小值
数组排序算法:
冒泡排序:
#!/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[@]}"
冒泡 是通过数字比较 将大的数往后排 小的数往前面排
5个数字 5-1=4 需要比较4轮 才能知道每一个数字的具体位置
a=(70 40 30 60 50)
轮次 总个数 需要比较的数 比几次 找到的数
第1轮 5 5个数 比4次 找到最大数
第2轮 5 4个数 比3次 找到第二大数
第3轮 5 3个数 比2次 找到第三大的数
第4轮 5 2个数 比1次 找到第四大的数