案例: 写一个脚本传参的方式做一个计算器 加减乘除
[root@test day3]# cat count.sh
#!/bin/bash
expr $1 + $2 &>/dev/null
[ $? -ne 0 ] && exit
echo $1+$2=$[$1+$2]
echo $1-$2=$[$1-$2]
echo $1*$2=$[$1*$2]
echo $1/$2=$[$1/$2]
num1=$1
num2=$2
echo $num1/$num2=$[$num1/$num2]
echo $num1+$num2=$[$num1+$num2]
echo $num1-$num2=$[$num1-$num2]
echo $num1*$num2=$[$num1*$num2]
read -p "Please Input two Number: " num1 num2
echo $num1/$num2=$[$num1/$num2]
echo $num1+$num2=$[$num1+$num2]
echo $num1-$num2=$[$num1-$num2]
echo $num1*$num2=$[$num1*$num2]
案例: 使用read传参 输入两个整数 是否为整数做判断 然后比对两个数字的大小(禁止使用if)
注意正则表达式: 并且&& 或者||
[root@test day3]# cat diff.sh
#!/bin/bash
read -p "Please input two number: " num1 num2
if [[ $num1 =~ ^[0-9]+$ && $num2 =~ ^[0-9]+$ ]];then
[ $num1 -gt $num2 ] && echo "$num1>$num2"
[ $num1 -lt $num2 ] && echo "$num1<$num2"
[ $num1 -eq $num2 ] && echo "$num1=$num2"
else
exit
fi
案例:
1. 获取磁盘使用率
2. 获取到的值如果大于80则发送邮件告警 小于80则提示磁盘使用率正常 并输出当前的值
[root@test day3]# cat disk.sh
#!/bin/bash
. /etc/init.d/functions
use_disk=`df -h|awk '/\/$/{print $(NF-1)}'`
if [ ${use_disk%\%} -gt 15 ];then
action "磁盘使用不正常" /bin/false
else
action "磁盘使用正常: $use_disk" /bin/true
fi
[root@test day3]# sh disk.sh
磁盘使用正常: 11% [ OK ]
1. 获取内存使用率
2. 如果内存值大于80则提示内存使用异常输出当前值 小于80则提示内存使用正常 输出当前值
[root@test day3]# cat free.sh
#!/bin/bash
. /etc/init.d/functions
use_free=`free|awk 'NR==2{print $3/$2*100}'`
if [ ${use_free%.*} -lt 10 ];then
action "内存使用不正常: $use_free" /bin/false
else
action "内存使用正常: $use_free" /bin/true
fi
[root@test day3]# sh free.sh
内存使用正常: 11.8201 [ OK ]
[root@test day3]# vim free.sh
[root@test day3]# sh free.sh
内存使用不正常: 11.8186 [FAILED]
1. 获取Linux操作系统的以下信息 输出到屏幕:
ETH0ip地址
公网IP地址
系统版本
虚拟平台Virtualization
内核版本
主机名称
磁盘使用率
内存使用率
负载
网络是否正常
[root@test day3]# cat test.sh
#!/bin/bash
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
fidsk=`df -h | grep 11|awk '{print $(NF-1)}'|grep 11 -o`
[ $fidsk -ge 80 ] && mail -s '磁盘报警' 798924094@qq.com < /server/scripts/fidsk.txt&>/dev/null || action "磁盘使用率" /bin/true
sleep 0.5
eth0=`ifconfig eth0|awk -F: NR==1'{print $1}'`
if [ $eth0 = $eth0 ];then
action "IP地址是: $eth0:$IP" /bin/true
else
action "IP地址是: $eth0:$IP" /bin/false
fi
sleep 0.5
gwIP=`curl -s cip.cc|grep ^IP |awk '{print $3}'`
if [ $gwIP = $gwIP ];then
action "公网IP地址: $gwIP" /bin/true
else
action "公网IP地址: $gwIP" /bin/false
fi
sleep 0.5
xtbb=`hostnamectl|grep Cen|awk '{print $3,$4,$5}'`
if [ xtbb = xtbb ];then
action "系统版本为: $xtbb" /bin/true
else
action "系统版本为: $xtbb" /bin/false
fi
sleep 0.5
xuni=`hostnamectl|grep vmwar|awk '{print $2}'`
if [ $xuni = $xuni ];then
action "虚拟平台为: $xuni" /bin/true
else
action "虚拟平台为: $xuni" /bin/false
fi
sleep 0.5
shuzi=`hostnamectl|grep x86-64|awk '{print $2}'`
if [ $shuzi = $shuzi ];then
action "内核版本为: $shuzi" /bin/true
else
action "内核版本为: $shuzi" /bin/false
fi
sleep 0.5
name=`hostname`
if [ $name = $name ];then
action "主机名为: $name" /bin/true
else
action "主机名为: $name" /bin/false
fi
sleep 0.5
free=`free -h|awk NR==2'{print $3/$2*100}'|awk -F [.4]+ '{print $1}'`
if [ $free -ge 80 ];then
mail -s "内存溢出" 798924094@qq.com < 内存溢出超过80
else
action "内存的使用率为: $free" /bin/true
fi
sleep 0.5
uptime=`uptime|awk -F "[ ,]+" '{print $(NF-2)}'|awk -F. '{print $1}'`
if [ $uptime -ge 60 ];then
mail -s "内存溢出" 798924094@qq.com < 内存溢出超过80
else
action "负载状态: $uptime" /bin/true
fi
sleep 0.5
ping -c1 -W1 www.baidu.com &>/dev/null
if [ $? -eq 0 ];then
action "网络情况" /bin/true
else
action "网络情况" /bin/false
fi
一.if判断
语法结构:
单分支语句: 一个条件 一个结果
第一种写法: then在表达的后面 加个分号;
if 条件表达式;then
执行的命令集合
fi
第二种写法: then在if的下面条件表达式的后面不需要加分号;
if 条件表达式
then
执行命令
fi
if [ 20 -eq 20 ]
then
echo ok
fi
if [ -f /etc/hosts ];then
echo 文件存在
fi
if [[ root =~ ^r ]]
then
echo ok
fi
if的单分支和&& 相同
一个条件 一个结果
[root@test day3]# [ 10 -eq 10 ] && echo ok
ok
[root@test day3]# [ 10 -eq 11 ] && echo ok
[root@test day3]# cat if.sh
if [ 10 -eq 10 ]
then
echo ok
fi
单条件
if [ 你有房 ]
then
我就嫁给你
fi
双分支 一个条件 两个结果
if [ 你有房 ]
then
我就嫁给你
else
拜拜
fi
[ 10 -eq 10 ] && echo 成立 || echo 不成立
多分支 多个条件 多个结果
if [ 你有房 ]
then
我就嫁给你
elif [ 你有钱 ]
then
我也嫁给你
elif [ 你活好 ] Linux学的好
then
先处对象
else
拜拜
fi
案例: 根据不同的操作系统版本安装不同的YUM源
1. 获取操作系统版本号
2. 通过表达判断
3. 部署YUM仓库
-------------------------- 框架
[root@test day3]# cat if.sh
#!/bin/bash
#获取操作系统版本号
os_vs=`awk '{print $(NF-1)}' /etc/redhat-release`
if [ ${os_vs%%.*} -eq 7 ]
then
# 备份默认YUM仓库
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载新的YUM仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
elif [ ${os_vs%%.*} -eq 6 ]
then
# 备份默认YUM仓库
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载新的YUM仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo
elif [ ${os_vs%%.*} -eq 8 ]
then
# 备份默认YUM仓库
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载新的YUM仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
fi
----------------------------------------
完善脚本:
[root@test day3]# cat if.sh
#!/bin/bash
#获取操作系统版本号
# 调用系统函数库
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
os_vs=`awk '{print $(NF-1)}' /etc/redhat-release`
backup_yum='mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup'
# 判断网络
ping -c1 -W1 www.baidu.com &>/dev/null
if [ $? -ne 0 ]
then
systemctl restart network
if [ $? -eq 0 ];then
action "重启网卡成功" /bin/true
else
action "网卡重启失败请手动检查配置" /bin/false
fi
ping -c1 -W1 www.baidu.com &>/dev/null
[ $? -ne 0 ] && action "请管理手动检查网络" /bin/false
fi
# 判断wget是否存在 不存在则安装
which wget &>/dev/null
if [ $? -ne 0 ]
then
echo "正在安装wget请稍等........"
yum -y install wget &>/dev/null
if [ $? -eq 0 ];then
action "wget install is " /bin/true
else
action "wget install is" /bin/false
echo "正在安装wget安装成功继续执行脚本.."
fi
fi
if [ ${os_vs%%.*} -eq 7 ]
then
# 备份默认YUM仓库
$backup_yum
# 下载新的YUM仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo &>/dev/null
if [ $? -eq 0 ];then
action "yum仓库安装" /bin/true
else
action "yum仓库安装" /bin/false
fi
elif [ ${os_vs%%.*} -eq 6 ]
then
# 备份默认YUM仓库
$backup_yum
# 下载新的YUM仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo
elif [ ${os_vs%%.*} -eq 8 ]
then
# 备份默认YUM仓库
$backup_yum
# 下载新的YUM仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
fi
--------------------------------------------------------------
案例: 输入两个整数判断比较两个数大小
[root@test day3]# cat num.sh
#!/bin/sh
read -p "Please Input two Number: " num1 num2
if [[ ! $num1 =~ ^[0-9]+$ || ! $num2 =~ ^[0-9]+$ ]];then
echo "请输入整数"
exit
fi
if [ $num1 -gt $num2 ]
then
echo "$num1 > $num2"
elif [ $num1 -lt $num2 ]
then
echo "$num1 < $num2"
else
echo "$num1 = $num2"
fi
案例: if菜单
打印输出菜单 安装多个不同的版本
[root@test day3]# cat server.sh
#!/bin/sh
echo -e "\t\t\t\t\t \033[40;32m 1.PHP \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 2.Redis \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 3.MySQL \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 4.Nginx \033[0m"
cat<<EOF
1.PHP
2.Redis
3.MySQL
4.Nginx
EOF
二级菜单:
[root@test day3]# cat server.sh
#!/bin/sh
echo -e "\t\t\t\t\t \033[40;32m 1.PHP \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 2.Redis \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 3.MySQL \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 4.Nginx \033[0m"
read -p "请输入你要安装的服务名称或者编号:[1|PHP|2|Redis|3|MySQL|4|Nginx] " num
if [ $num = 1 -o $num = PHP ]
then
echo -e "\t\t\t\t\t \033[40;34m 1.PHP5.4 \033[0m"
echo -e "\t\t\t\t\t \033[40;34m 2.PHP7.1 \033[0m"
echo -e "\t\t\t\t\t \033[40;34m 3.PHP7.2 \033[0m"
echo -e "\t\t\t\t\t \033[40;34m 4.PHP7.4 \033[0m"
read -p "请选择你要安装的版本号:[1|2|3]" num
if [ $num -eq 1 ];then
echo "yum_install_php5.4............."
elif [ $num -eq 2 ];then
echo "yum_install_php7.1............."
else
echo "请按照菜单选择别瞎选!!!"
exit
fi
elif [ $num = 2 -o $num = Redis ]
then
echo -e "\t\t\t\t\t \033[40;33m 1.Redis-1.6 \033[0m"
echo -e "\t\t\t\t\t \033[40;33m 2.Redis-1.7 \033[0m"
echo -e "\t\t\t\t\t \033[40;33m 3.Redis-1.8 \033[0m"
echo -e "\t\t\t\t\t \033[40;33m 4.Redis-1.9 \033[0m"
read -p "请选择你要安装的版本号:[1|2|3]" num
if [ $num -eq 1 ];then
echo "yum_install_redis1.6............."
elif [ $num -eq 2 ];then
echo "yum_install_redis1.7............."
fi
else
echo "请按照菜单选择别瞎选!!!"
exit
fi
------------------------------完善
[root@test day3]# cat server.sh
#!/bin/sh
while true
do
echo -e "\t\t\t\t\t \033[40;32m 1.PHP \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 2.Redis \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 3.MySQL \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 4.Nginx \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 5.退出脚本 \033[0m"
read -p "请输入你要安装的服务名称或者编号:[1|PHP|2|Redis|3|MySQL|4|Nginx] " num
if [ $num = 1 -o $num = PHP ]
then
while true
do
echo -e "\t\t\t\t\t \033[40;34m 1.PHP5.4 \033[0m"
echo -e "\t\t\t\t\t \033[40;34m 2.PHP7.1 \033[0m"
echo -e "\t\t\t\t\t \033[40;34m 3.PHP7.2 \033[0m"
echo -e "\t\t\t\t\t \033[40;34m 4.PHP7.4 \033[0m"
echo -e "\t\t\t\t\t \033[40;34m 5.返回主菜单 \033[0m"
read -p "请选择你要安装的版本号:[1|2|3]" num
if [ $num -eq 1 ];then
echo "yum_install_php5.4............."
elif [ $num -eq 2 ];then
echo "yum_install_php7.1............."
elif [ $num -eq 5 ];then
break
else
echo "请按照菜单选择别瞎选!!!"
exit
fi
done
elif [ $num = 2 -o $num = Redis ]
then
echo -e "\t\t\t\t\t \033[40;33m 1.Redis-1.6 \033[0m"
echo -e "\t\t\t\t\t \033[40;33m 2.Redis-1.7 \033[0m"
echo -e "\t\t\t\t\t \033[40;33m 3.Redis-1.8 \033[0m"
echo -e "\t\t\t\t\t \033[40;33m 4.Redis-1.9 \033[0m"
read -p "请选择你要安装的版本号:[1|2|3]" num
if [ $num -eq 1 ];then
echo "yum_install_redis1.6............."
elif [ $num -eq 2 ];then
echo "yum_install_redis1.7............."
fi
elif [ $num = 5 ]
then
exit
else
echo "请按照菜单选择别瞎选!!!"
echo "请重新输入编号"
fi
done
----------------------------------------------------------------------------
案例:
猜数字游戏
1.生成一个随机数
2.让用户输入数字
3.猜大小 大了提示大了 小则提示小了 输入正确则提示恭喜猜对了
$RANDOM 数字范围: 0-32767
echo $((RANDOM%100+1)) 1-100的数字
[root@test day3]# cat ran.sh
#!/bin/bash
ran=`echo $((RANDOM%100+1))`
while true
do
let i++
read -p "请你输入要猜的数字[1-100]: " num
if [ $num -gt $ran ]
then
echo "你输入数字的大了"
elif [ $num -lt $ran ]
then
echo "你输入数字的小了"
else
echo "恭喜你猜对了中奖号码是: $ran"
echo "总共猜了$i 次"
exit
fi
done
作业:
系统自动猜 并且统计猜的数字
系统猜过的数字放入一个文本
然后过滤统计判断 如果有则重复赋值
(重复赋值)
[root@test day3]# cat test.sh
#!/bin/bash
> 1.txt
num=`echo $((RANDOM%100+1))`
while true
do
while true
do
ran=`echo $((RANDOM%100+1))`
if [ `grep -w $ran 1.txt|wc -l` -eq 1 ];then
continue 忽略剩余语句,从头开始继续执行
else
let i++
echo $ran >> 1.txt
break
fi
done
if [ $num -eq $ran ];then
echo "恭喜系统猜对了$i 次"
exit
fi
done
双色球
6红+1个篮球 共7个号码
6红数字范围: 1-33
1个篮球: 1-16
ran1=`echo $((RANDOM%100+1))`
ran2=`echo $((RANDOM%100+1))`
ran3=`echo $((RANDOM%100+1))`
当前1-33里的数字被赋值 不能在给其他变量赋值
二.for循环
for 变量名称 in 取值列表
do
动作
done
取值列表: 数字 字符串 命令 序列 以空格为分隔符
循环数字:
[root@test day3]# cat for.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
[root@test day3]# sh for.sh
1
2
3
4
5
循环字符串
[root@test day3]# cat for.sh
#!/bin/bash
for i in oldboy test1 lidao
do
echo $i
done
[root@test day3]# sh for.sh
oldboy
test1
lidao
值的列表可以使用双引号引用
[root@test day3]# cat for.sh
#!/bin/bash
for i in "oldboy test1" lidao
do
echo $i
done
[root@test day3]# sh for.sh
oldboy test1
lidao
注意: 输出的结果可以和for循环的列表没有任何关系 和循环次数有关 赋值几次则动作执行几次
[root@test day3]# cat for.sh
#!/bin/bash
for i in a b c
do
echo ok
done
[root@test day3]# sh for.sh
ok
ok
ok
统计循环或者赋值次数
[root@test day3]# cat for.sh
#!/bin/bash
for i in a b c
do
let a++
done
echo $a
[root@test day3]# sh for.sh
3
for循环读取文件
[root@test day3]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@test day3]# cat for.sh
#!/bin/bash
for i in `cat /etc/hosts`
do
echo $i
done
[root@test day3]# sh for.sh
127.0.0.1
localhost
localhost.localdomain
localhost4
localhost4.localdomain4
::1
localhost
localhost.localdomain
localhost6
localhost6.localdomain6
for循环支持序列
[root@test day3]# cat for.sh
#!/bin/bash
for i in {a..c}
do
echo $i
done
[root@test day3]# sh for.sh
a
b
c
[root@test day3]# cat for.sh
#!/bin/bash
for i in {1..10}
do
echo $i
done
[root@test day3]# sh for.sh
1
2
3
4
5
6
7
8
9
10
[root@test day3]# cat for.sh
#!/bin/bash
for i in `seq 10`
do
echo $i
done
案例1: 测试一个网段内的IP地址是否在线 笔试题
ping通则为在线
[root@test day3]# cat for.sh
#!/bin/bash
for i in {1..10}
do
{
ip=10.0.0.$i
ping -c1 -W1 $ip &>/dev/null
if [ $? -eq 0 ]
then
echo "$ip 在线"
fi
} &
done
wait # 等待后台程序执行完毕后继续往下执行
echo done..................
案例2: 批量创建用户 每个用户8位随机密码 并且保存用户名对应密码关系表
要求用户输入前缀 用户输入个数test01..test10
echo "123456" | passwd --stdin root
[root@test day3]# cat user.sh
#!/bin/bash
read -p "请输入用户名称的前缀: " prefix
read -p "请输入要创建用户的个数: " num
for i in `seq $num`
do
echo ${prefix}$i
done
read -p "删除还是创建以上用户[y|n]" re
if [ $re = y ]
then
for a in `seq $num`
do
user=${prefix}$a
id $user &>/dev/null
if [ $? -ne 0 ];then
useradd $user
if [ $? -eq 0 ];then
echo "$user 创建成功"
fi
else
echo "useradd: user $user 已存在"
fi
done
elif [ $re = n ]
then
for b in `seq $num`
do
user=${prefix}$b
id $user &>/dev/null
if [ $? -eq 0 ];then
userdel -r $user
[ $? -eq 0 ] && echo "$user 删除成功"
else
echo "$user 不存在"
fi
done
fi
案例3: for循环从1加到100 笔试题
[root@test day3]# cat for1.sh
#!/bin/bash
for i in {1..100}
do
count=$[$count+$i]
done
echo $count
[root@test day3]# cat for1.sh
#!/bin/bash
for i in {1..100}
do
count=$[count+i] # 此处括号中可以不加$
done
echo $count
[root@test day3]# seq -s + 100|bc
5050
案例4:反向破解随机数的MD5值
[root@test day3]# cat for2.sh
num1=31d30eea8d0968d6458e0ad0027c9f80
for i in `seq 15`
do
ran=`echo ${i}|md5sum|awk '{print $1}'`
if [ $num1 = $ran ]
then
echo "$i $ran"
fi
done
[root@test day3]# sh for2.sh
10 31d30eea8d0968d6458e0ad0027c9f80
----------------破解出对应的数字
4f9f2d27
091ba725
acf6c3a0
f3f5799e
1fe0fee
a4954ca
--------------------------------
作业: 编写吃饭脚本
1. 菜单
快餐
炒菜
驴肉火烧
王八
...
...
2. 按键随机选择中午晚上吃啥
1.菜单 价格
2.会员卡 直接消费 (加会员卡密码) 预留邮箱 找回密码
3.没有会员 是否办理 办理是否有有优惠冲1000送亿万 数值写入文件中 会员姓名: 存储余额
4.消费点菜
5.结账会员结账 处理文本
6.将余额发送企业微信