一、函数
1.函数的作用
定义较为复杂的但是需要重复使用的内容,以便再次使用可以直接调用函数节约时间,提高效率
在编写脚本时,有些脚本可以反复使用,可以调用函数来解决,语句块定义成函数约等于别名
函数定义:封装的可重复利用的具有特定功能的代码
使用函数可以避免代码重复,增加可读性,简化脚本
使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强
函数使用步骤
①首先是定义函数
②其次是调用函数(注意:若定义完成不调用则函数无效)
③查看系统限制所有函数:declare -F
④查看函数定义详细内容:declare -f 函数名
⑤删除函数 :unset 函数名
函数使用方法:
1. 定义函数 2. 再引用函数
2.函数的基本格式
第一种:
[function] 函数名 (){
命令序列
[return x] #使用return或者exit可以显式的结束函数
}
第二种:
一般用这一种
函数名(){
命令序列
}
第三种:
function 函数名 {
函数内容
}
实验1:用函数 判断操作系统是centos 还是ubuntu
#!/bin/bash
os () {
if grep -q centos /etc/os-release ;then
echo "操作系统是centos"
elif grep -q ubuntu /etc/os-release ;then
echo "操作系统是ubuntu"
else
echo "操作系统按不支持"
fi
}
os
判断操作系统是centos 还是ubuntu
实验2:建立专门的函数文件
接着上面继续, 这是在data下
然后调用就可以了
我们模拟下在 ~家目录下:
color ()[
red="echo -eE[31m"
green="echo -e E[32m'
end="\E[Om"
3.注意事项
-
直接写 函数中调用函数 直接写函数名
-
同名函数 后一个生效
-
调用函数一定要先定义
-
每个函数是独立
declare -F
#查看当前已定义的函数名
declare -f
#查看当前已定义的函数定义
declare -f func_name
#查看指定当前已定义的函数名
declare -F func_name
#查看当前已定义的函数名定义
4.删除函数
删除函数 :unset 函数名
5.函数的返回值
return表示退出函数并返回一个退出值,脚本中可以用S?变量显示该值
使用原则:
函数一结束就取返回值,因为S?变量只返回执行的最后一条命令的退出状态码
退出状态码必须是0~255,超出时值将为除以256取余
return
函数的退出状态码:
默认取决于函数中执行的最后一条命令的退出状态码自定义退出状态码,其格式为:
return 从函数中返回,用最后状态命令决定返回值
return 0无错误返回
return 1-255 有错误返回return 只能用在函数中
#!/bin/bash
ip () {
read -p "请输入一个ip地址: " host
[[ "$host" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || { echo "ip 地址不合法" ;return
1; }
}
ip
实验1:判断输入IP地址正确与否
实验2:判断是否为管理员用户登录
#!/bin/bash
user () {
if [ $USER = root ]
then echo "这是管理员用户"
else
echo "这不是管理员用户"
return 1
fi
}
user
6.函数的传参数
实验:
我们修改脚本,模式换下位置:
一般不会这样的,按着顺序来下哦
7.使用函数文件
我们可以新建一个专门存放函数的文件 (参考标题2)
8.函数的作用范围
函数在shell脚本中仅在当前的shell环境中有效
shell脚本中函数的变量默认全局有效
将变量限定在函数内部使用local命令
9. 函数递归
函数调用自己本身的函数,必须要有结束函数的语句,防止死循环
阶乘
阶乘是基斯顿·卡曼于 1808 年发明的运算符号,是数学术语
一个正整数的阶乘 (factorial) 是所有小于及等于该数的正整数的积,并且0和1的阶乘为1,自然数n的阶乘写作n!
n!=1x2x3x...xn
阶乘亦可以递归方式定义: 0!=1,n!=(n-1)!xn
n!=n(n-1)(n-2)...1
n(n-1)! = n(n-1)(n-2)!
! 表示阶乘
0!=1
1=1X0!
2!=2x1!
3!=3x2!
4!=4x3!
实验1:用 for 循环写阶乘
#!/bin/bash
read -p "请输入一个正整数:" num
sum=1
for i in `seq $num`
do
let sum=$[i*sum]
done
echo "阶乘结果是" $sum
实验2:用函数写阶乘
#!/bin/bash
fact () {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[$1-1]
local result=`fact $temp`
echo "$[$1 * result]"
fi
}
fact $1
帮助理解下,如图:
实验:使用函数一键安装nginx脚本
先去nginx官网,下载,鼠标右击复制连接
nginx.org非盈利组织,开源不一定免费 ,只有新机器才需要安装
可以过滤下CPU
#!/bin/bash
cpu=`lscpu |grep "CPU(s)"|awk '{print$2}'|head -n1`
read -p "输入安装目录(绝对路径):" dir
cd /data
wget http://nginx.org/download/nginx-1.18.0.tar.gz &>/dev/null
tar xf nginx-1.18.0.tar.gz
yum -y install gcc gcc-c++ pcre-devel openssl-devel zlib-devel openssl openssl-devel &>/dev/null
cd /data/nginx-1.18.0
./configure --prefix=$dir &>/dev/null
make -j $cpu &>/dev/null
make install &>/dev/null
if [ $? -eq 0 ]
then
echo "安装成功"
else
echo "安装失败"
fi
二、数组
1.前言
将全班学生定义成一个变量,无法使用普通变量。
-
普通数组
-
关联数组
变量和属组
-
变量:存储单个元素的内存空间
-
数组:存储多个元素的连续的内存空间,相当于多个变量的集合
数组名和索引
-
索引的编号从0开始,属于数值索引
-
索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持
-
bash的数组支持稀疏格式(索引不连续)
2.shell数组的定义
数组中可以存放多个值,Bash Shell 只支持一维数组(不支持多维数组)
数组元素的下标由 0 开始
Shell 数组用括号来表示,元素用"空格"符号分割开
在shell语句中,使用、遍历数组的时候,数组格式要写成 ${arr[@]} 或 ${arr[*]}
3.定义数组格式
方法一:
数组名=(value1 value2 ... valuen)
[root@zzh data]#a=(1 2 3 4 5)
[root@zzh data]#echo ${a[@]}
1 2 3 4 5
方法二:
数组名=([0]=value0 [1]=value0 [2]=value0 ...)
[root@zzh data]#b=([0]=1 [1]=2 [2]=3 [3]=4 [4]=5)
[root@zzh data]#echo ${b[@]}
1 2 3 4 5
方法三:
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
[root@localhost data03]#c[0]=1
[root@localhost data03]#c[1]=2
[root@localhost data03]#c[2]=3
[root@localhost data03]#c[3]=4
[root@localhost data03]#echo ${c[@]}
1 2 3 4
4.获取数组的数据列表
echo ${数组名[*]}
echo ${数组名[@]}
实验:使用函数 随机点名
#!/bin/bash
a=(xm xh xl xw lzl zs)
num=`echo $[RANDOM%6]`
echo ${a[$num]}