shell 02
================================================
一,运算
加 减 乘 除 求模(取余数)
1,expr 可以运算并输出
expr 1 + 1 //加法运算,运算符号两边要加空格
expr 2 - 1
expr 2 '*' 2 //使用单引号屏蔽*的特殊功能即可实现乘法
expr 2 \* 2 //使用转义符号屏蔽*的特殊功能
expr 4 / 2
expr 10 % 3
a=10
b=20
expr $a + $b 还能进行变量的运算
expr $a + 100
expr $a + $a
2,使用$[ ] 或者 $(( ))
echo $[1+1]
echo $[2-1]
echo $[2*2]
echo $[2/2]
echo $[2%2]
echo $[a+a]
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计算器,可以进行小数运算
echo "1.1+1" | bc //非交互的方式使用bc工具
echo "scale=3;10/3" | bc //scale可以定义小数点后面的长度
------------------------------------------------------------
二,条件测试,可以为脚本赋予智能判断的效果
使用格式:1, test 表达式 2, [ 表达式 ]
测试方式:
-
对字符串进行测试
== 判断两边是否相等 != 判断两边是否不等
test a == a
test a == b
[ a == a ] //使用常量判断,再用echo $?测试结果
[ a == b ]
[ $a == $b ] //使用变量判断两个变量的值是否相等
[ $a != $b ] //使用变量判断两个变量的值是否不相等
-z 判断变量是否为空 ! -z 判断变量是否非空
a=10
[ -z $a ] //判断变量a是否为空,如果为空则判断正确
[ ! -z $a ] //判断变量a中是否有值,有值则判断正确
-
逻辑符号
&& 之前指令执行成功才会执行之后指令
|| 之前指令执行失败才会执行之后指令
#!/bin/bash
[ $USER == root ] || exit //如果用户不是管理员就退出
[ $USER != root ] && exit //效果同上,另一种写法
yum -y install vsftpd
systemctl restart vsftpd
systemctl enable vsftpd
#!/bin/bash
read -p "请输入用户名称:" n
[ -z $n ] && exit //判断用户名为空的话就退出脚本
useradd $n
stty -echo
read -p "请输入密码:" m
echo
stty echo
echo "$m" | passwd --stdin $n
上述是1个逻辑符号的使用情况,但有时需求比较复杂可能需要2个逻辑符号组合,那么使用后效果可以按以下方式检测:
touch a b c
ls a && ls b && ls c //结果是都显示,第一个ls执行成功,然后导致第二个ls也执
行,并且可以成功,这样的话第一个和第二个任务都成功了,那么这个组合就算成
功,然后会导致第二个逻辑符号&&后面的ls c 也执行并且成功。
ls a || ls b || ls c //结果是显示a,第一个ls执行成功,第二个ls就不会执行了,这
两个任务中间是|| ,那么只要有一个成功就算这个组合执行成功,由于这个组合算
成功,所以就不会执行第二个||后面的任务了
ls a && ls b || ls c //结果是显示a和b,第一个ls执行成功,然后导致第二个ls也
执行,并且可以成功,这样的话第一个和第二个任务都成功了,那么这个组合就算
成功,但是由于第二个逻辑符号是||,就不会执行最后的ls c任务了
ls a || ls b && ls c //结果是显示a和c,第一个ls执行成功,第二个ls就不会执行
了,这两个任务中间是|| ,那么只要有一个成功就算这个组合执行成功,所以就会
导致第二个逻辑符号&&后面的ls c执行
再次修改脚本:
#!/bin/bash
read -p "请输入用户名称:" n
[ -z $n ] && echo "你倒是给个名字阿!" && exit //退出前添加提示
useradd $n
stty -echo
read -p "请输入密码:" m
echo
stty echo
echo "$m" | passwd --stdin $n
-
数字
-eq 是否相等 -ne 是否不等 -gt 是否大于
-ge 是否大于等于 -lt 是否小于 -le 是否小于等于
[ 1 -eq 1 ] //判断1是否等于1
[ 3 -ge 5 ] //判断3是否大于等于5
a=10
b=20
[ $a -ne $b ] //判断变量a是否不等于变量b
-
文件
-e 判断文件是否存在,不关心类型
-f 判断文件是否存在,必须是普通文件
-d 判断文件是否存在,必须是目录
-r 判断当前用户对文件是否有读权限,对root无效
-w 判断当前用户对文件是否有写权限,对root无效
-x 判断当前用户对文件是否有执行权限(目录是否可以进入)
----------------------------------------------------------------------------------
编写脚本,每2分钟检查服务器登录账户数量,如果超过3人
发邮件通知管理员
vim test01.sh
#!/bin/bash
n=$(who | wc -l) //n里面存储了登录数量
[ $n -gt 3 ] && echo "服务器被入侵!可能牛老师来了!" | mail -s test root
//用n和3对比,如果超过3就发邮件
chmod +x test01.sh //脚本写完后,赋予x权限
crontab -e //编写计划任务
*/2 * * * * /opt/test01.sh //每2分钟执行脚本,然后保存退出
只要目前超过3人登录系统,那么每隔2分钟就会收到邮件,使用mail命令
查看邮件
-----------------------------------------------------
虽然&&和||可以实现逻辑组合,但如果情况比较复杂就可能需要n多个&&或者||,会导致脚本难写,可读性差。此时就可以使用if分支
三,if分支
-
单分支
if 条件测试;then //如果条件测试成功,那就执行下面的所有指令(指令可以有很多)
执行指令
fi
#!/bin/bash
if [ $USER == root ];then
echo "你是管理员~"
fi
-
双分支
if 条件测试;then //如果条件测试成功,就执行下面的所有指令(指令可以有很多)
执行指令
else
执行指令 //如果上述条件测试失败,那就执行下面的指令
fi
#!/bin/bash
if [ $USER == root ];then
echo "你是管理员~"
else
echo "你不是管理员~"
fi
---------------------------------------------------
ping -c 定义ping的次数 -i 定义ping的间隔时间(秒)
-W ping失败时多久反馈结果
---------------------------------------------------
[root@svr7 opt]# cat test03.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 1 $1 &> /dev/null
if [ $? -eq 0 ];then
echo "通了!"
else
echo "不通!"
fi
-
多分支