运算
加 减 乘 除 求模(求余数)
1.expr 可以运算并输出
[root@svr7 ~]# expr 1 + 1 #加法运算,运算符号两边要加空格
]# expr 2 - 1
]# expr 2 '*' 2 # 使用单引号屏蔽*的特殊功能即可实现乘法
[root@svr7 ~]# expr 2 \* 2 #使用转义符号屏蔽*的特殊功能
[root@svr7 ~]# expr 4 / 2 #4除以2
[root@svr7 ~]# expr 10 % 3 #取余数
进行变量的运算
[root@svr7 ~]# a=10
[root@svr7 ~]# b=20
[root@svr7 ~]# expr $a + $b
[root@svr7 ~]# expr $a + 100
[root@svr7 ~]# expr $a + $a
2.使用$[ ] 或者 $(( ))
[root@svr7 ~]# echo $[1+1]
3.使用let命令,不显示结果,通常用于变量的创建于自增减
功能一:let a=1+1 #变量的创建,然后可以用echo $a查结果
功能二:对变量进行自增减
常规写法 主流写法
- let a=a+1 let a++ 变量的自增减,将变量a的值加1
- let a=a-1 let a-- 变量a减1
- let a=a+2 let a+=2 变量a加2
- let a=a-2 let a-=2 变量a减2
- let a=a*10 let a*=10 变量a乘以10
4.使用bc计算器,可以进行小数运算
[root@svr7 ~]# echo "1.1+1" | bc
[root@svr7 ~]#echo "scale=3;10/3" | bc #scale可以定义小数点后面的长度
条件测试 可以为脚本赋予智能判断的效果
使用格式:1, test 表达式 2, [ 表达式 ]
测试方式:
1.对字符串进行测试
== 判断两边是否相等 != 判断两边是否不等
[root@svr7 ~]# test a == a
[root@svr7 ~]# [ a == a ]
[root@svr7 ~]# echo $? #进行测试结果,输出0为正确,1为错误
[root@svr7 ~]# [ $a == $b ] #使用变量判断两个变量的值是否相等
[root@svr7 ~]# [ $a != $b ] #使用变量判断两个变量的值是否不相等
-z 判断变量是否为空 ! -z 判断变量是否非空 -z判断是否为空(是空的话为0,因为是空的就会输出0) ! -z判断是否为非空(非空的话为0,因为是非空就输出0)
[root@svr7 ~]# a=10
[root@svr7 ~]# [ -z $a ] #判断变量a是否为空,如果为空则判断正确0
[root@svr7 ~]# [ ! -z $a ] #判断变量a中是否有值,有值则判断正确0
2.逻辑符号
&& 之前指令执行成功才会执行之后指令
|| 之前指令执行失败才会执行之后指令
[root@svr7 ~]# vim /opt/test01.sh
#!/bin/bash
[ $USER == root ] || exit #如果用户不是管理员就退出
[ $USER != root ] && exit #两种写法
yum -y install vsftpd #安装ftp服务
systemctl restart vsftpd #重启服务
systemctl enable vsftpd #设置开机自启
[root@svr7 ~]# vim /opt/test02.sh
#!/bin/bash
read -p "请输入用户名称:" n #交互式创建用户
[ -z $n ] && exit #判断用户名为空的话就退出脚本
useradd $n
stty -echo #屏蔽回显,输入任何信息都不会显示
read -p "请输入密码:" m #交互式设置密码
echo
stty echo #恢复显示
echo "$m" | passwd --stdin $n #将m设置为密码
使用多个逻辑符号
[root@svr7 ~]# touch a b c #创建三个文件
[root@svr7 ~]# ls a && ls b && ls c #结果是都显示,第一个ls执行成功,然后导致第二个ls也执行,
并且可以成功,这样的话第一个和第二个任务都成功了,那么
这个组合就算成功,然后会导致第二个逻辑符号&&后面的ls c 也执行并且成功。
[root@svr7 ~]# ls a || ls b || ls c # 结果是显示a,第一个ls执行成功,第二个ls就不会执行了,这
两个任务中间是|| ,那么只要有一个成功就算这个组合执行成
功,由于这个组合算成功,所以就不会执行第二个||后面的任务了
[root@svr7 ~]# ls a && ls b || ls c #结果是显示a和b,第一个ls执行成功,然后导致第二个ls也
执行,并且可以成功,这样的话第一个和第二个任务都成功了,
那么这个组合就算成功,但是由于第二个逻辑符号是||,就不会
执行最后的ls c任务了ls a || ls b && ls c //结果是显示a和c,
第一个ls执行成功,第二个ls就不会执行了,这两个任务中间是|| ,
那么只要有一个成功就算这个组合执行成功,所以就会导致第二个逻辑符号&&后面的ls c执行
更新脚本2
[root@svr7 ~]# vim /opt/test02.sh
#!/bin/bash
read -p "请输入用户名称:" n
[ -z $n ] && echo "你倒是给个名字阿!" && exit #退出前添加提示,没有用户名的情况下
useradd $n
stty -echo
read -p "请输入密码:" m
echo
stty echo
echo "$m" | passwd --stdin $n
3.数字
- -eq 是否相等
- -ne 是否不等
- -gt 是否大于
- -ge 是否大于等于
- -lt 是否小于
- -le 是否小于等于
[root@svr7 ~]# [ 1 -eq 1 ] #判断1是否等于1
[root@svr7 ~]# [ 3 -ge 5 ] #判断3是否大于等于5
[root@svr7 ~]# a=10
[root@svr7 ~]# b=20
[root@svr7 ~]# [ $a -ne $b ] #判断变量a是否不等于变量b
4.文件
- -e 判断文件是否存在,不关心类型
- -f 判断文件是否存在,必须是普通文件
- -d 判断文件是否存在,必须是目录
- -r 判断当前用户对文件是否有读权限,对root无效
- -w 判断当前用户对文件是否有写权限,对root无效
- -x 判断当前用户对文件是否有执行权限(目录是否可以进入)
编写脚本,每2分钟检查服务器登录账户数量,如果超过3人发邮件通知管理员
[root@svr7 ~]#vim test03.sh
#!/bin/bash
n=$(who | wc -l) #n里面存储了登录数量
[ $n -gt 3 ] && echo "服务器被入侵" | mail -s test root #用n和3对比,如果超过3就发邮件
[root@svr7 ~]# chmod +x test01.sh #脚本写完后,赋予x权限
[root@svr7 ~]# crontab -e #编写计划任务
*/2 * * * * /opt/test01.sh #每2分钟执行脚本,然后保存退出只要目前超过3人登录系统,那么每隔2分钟就会收到邮件,使用mail命令查看邮件
虽然&&和||可以实现逻辑组合,但如果情况比较复杂就可能需要n多个&&或者||,会导致脚本难写,可读性差。此时就可以使用if分支
三,if分支
- 单分支
if 条件测试;then #如果条件测试成功,那就执行下面的所有指令(指令可以有很多)
执行指令
fi
[root@svr7 ~]#vim /opt/test04.sh
#!/bin/bash
if [ $USER == root ];then
echo "你是管理员~"
fi
2.双分支
if 条件测试;then #如果条件测试成功,就执行下面的所有指令(指令可以有很多)
执行指令
else
执行指令 #如果上述条件测试失败,那就执行下面的指令
fi
[root@svr7 ~]#vim /opt/test04.sh
#!/bin/bash
if [ $USER == root ];then
echo "你是管理员~"
else
echo "你不是管理员~"
fi
---------------------------------------------------
ping -c 定义ping的次数 -i 定义ping的间隔时间(秒) -W ping失败时多久反馈结果
---------------------------------------------------
[root@svr7 opt]# cat test05.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 1 $1 &> /dev/null
if [ $? -eq 0 ];then
echo "通了!"
else
echo "不通!"
fi
3.多分支
if 条件测试;then #如果条件测试成功,就执行下面的所有指令(指令可以有很多)
执行指令
elif 条件测试;then //如果条件测试成功,就执行下面的指令
执行指令
elif 条件测试;then //如果条件测试成功,就执行下面的指令
执行指令
.........
else
执行指令 //如果上述条件测试失败,那就执行下面的指令
fi
#!/bin/bash
read -p "期末考试成绩如何?" n
if [ $n -ge 90 ];then
echo "优秀!"
elif [ $n -ge 80 ];then
echo "良好!"
elif [ $n -ge 60 ];then
echo "及格!"
else
echo "晚上没饭了!"
fi
-----------------------------------------------------------------
四,循环
有时我们需要某个或者某群任务反复在服务器中执行很多次,就可以使用循环命令写成脚本,而无需手工一次次执行
1.for循环,有次数的循环
for 变量名 in 值1 值2 值3 。。。。 #此处变量名可以自定义,通常习惯用i,值的多少决定了下面do与done之间的任务执行多少次,每个值之间有空格,这里是有3个值,所以就循环执行指令3次
do
循环任务
done
--------------------------------
#!/bin/bash
for i in {1..100} #执行100次任务的简略写法,但不支持变量
do
echo ${i}abc
done
----------------------------------
#!/bin/bash
a=100
for i in $(seq $a) #使用seq支持变量
do
echo ${i}abc
done
--------------------------------------------
编写脚本,用ping命令测试192.168.4.1~192.168.4.15是否可以通
#!/bin/bash
for i in {1..15}
do
ping -c 3 -i 0.2 -W 1 192.168.4.$i &> /dev/null
if [ $? -eq 0 ];then
echo "4.$i 通了!"
else
echo "4.$i 不通!"
fi
done
-------------------------------------------
显示ping通的次数
#!/bin/bash
x=0
y=0
for i in {1..15}
do
ping -c 3 -i 0.2 -W 1 192.168.4.$i &> /dev/null
if [ $? -eq 0 ];then
echo "4.$i 通了!"
let x++
else
echo "4.$i 不通!"
let y++
fi
done
echo "$x台通了,$y台不通"