分享一些shell,持续更新ing~
(有工作中用到的,有面试问到的,小伙伴们可以收藏一下。)
一.(打印99乘法表。)
#!/bin/bash
for i in `seq 9`
do
for j in `seq 9`
do
[ $j -le $i ] && echo -n "$i x $j = `echo $(($i*$j))` "
done
echo ""
done
二.(1到某个数字相加的值。)
#!/bin/bash
read -p "请输入一个数字" nub
sum=0;
for ((i=0;i<=$nub;i++))
do
sum=`expr $sum + $i`
done
echo $sum
三.一对兔子一年内(12个月)能繁殖成多少对?
#!/bin/bash
#有个人想知道,一年之内一对兔子能繁殖多少对?于是就筑了一道围墙把一对兔子关在里面。
#已知一对兔子每个月可以生一对小兔子,而一对兔子从出生后第3个月起每月生一对小兔子。
#假如一年内没有发生死亡现象,那么,一对兔子一年内(12个月)能繁殖成多少对?
#兔子的规律为数列,1,1,2,3,5,8,13,21)
f1=1 #第一个月
f2=1 #第二个月
sum=0 #一年洪一共有多少
for ((i=3;i<=12;i++)) #第一次生小兔子是在3月份
do
sum=$[ $f1+$f2 ]
f1=$f2
f2=$sum
done
echo "一对兔子一年内可以繁殖$sum只兔子"
四.猜数字小游戏
#!/bin/sh
echo " 猜数字游戏开始啦~"
read -p "请输入您的姓名: " name
biggest=1000 # 可能出现的最大数字
guess=0 # 你的猜测值
guesses=0 # 猜测的次数
number=$(($$ % $biggest)) # 随机数字。介于1和$biggest之间
while [ $guess -ne $number ]
do
echo -n "你猜? " ; read guess
if [ "$guess" -lt $number ] ; then
echo "... 太小了!"
elif [ "$guess" -gt $number ] ; then
echo "... 太大了"
fi
guesses=$(($guesses + 1))
done
echo "恭喜您:$name,猜中了。 数字为$number 猜测了 $guesses 次 游戏结束."
exit 0
五.批量创建用户
#!/bin/sh
read -ep "请输入要创建的用户数量:" sl #获取用户键盘输入的值 为$sl
for i in `seq 1 $sl` #定义i变量进行遍历 从1开始导$sl值 直到i=sl 结束
do
grep "user-$i" /etc/passwd &> /dev/null #查看在/etc/passwd中有没有该用户
if [ $? -ne 0 ];then #-ne 不等于 $? 获取上一条命令的返回值 如果=0 跳到else输出 如果=0 进入if循环
useradd user-$i &>/dev/null #创建用户
if [ $? -eq 0 ];then #-eq 等于
echo "user-$i" >> /root/user_name #吧创建成功的用户名追加输出到/root/user_name
echo "user-$i" | passwd user-$i --stdin &> /dev/null #设置当前创建的用户密码为用户名
echo "创建成功"
fi
else
echo "user-$i 用户已存在,创建失败!"
fi
done
六.监控mysql主从同步是否正常。
#!/bin/bash
#获取本地服务端口,是否为3306根据情况修改。
MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{ print $5 }'`
#获取本机IP,发邮件报警时调用,可以不写。
MYSQLIP=`ifconfig ens33|grep "inet "|awk -F[:" "]+ '{ print $3 }'`
#显示当前时间,年月时分秒
date=`date "+%Y-%m-%d %H:%M:%S"`
#获取IO及SQL线程行
STATUS=$(mysql -uroot -S /var/lib/mysql/mysql.sock -e "show slave status \G" |grep -i "running")
#提取I/O及SQL线程的状态,Yes或No
IO_env=`echo $STATUS |grep IO |awk '{ print $2 }'`
SQL_env=`echo $STATUS |grep SQL |awk '{ print $2 }'`
#判断变量值是否=本地端口号
#日志发送格式 mail -s "标题" 邮箱 << "内容"
#或者 echo "内容"| mail -s mail -s "标题" 邮箱
if [ "$MYSQLPORT" = "3306" ]; then
echo " mysql is running" >/dev/null
else
echo "mysql is shutdown"
echo "$MYSQLIP is shutdown $date" | mail -s " MYSQL IS shutdown" 70697410@qq.com
fi
#-a 如果存在即为真 左右两个判断都要同时存在
if [ "IO_env"="Yes" -a "$SQL_env"="Yes" ]; then
echo "slave is running!" >/dev/null
else
echo "slave is not running! $date" >> /usr/src/mariadb_error.log #这里写不写都无所谓
echo "slave not running $date" | mail -s "MYSQLIP is not running" 70697410@qq.com
fi
七.监控系统cpu,大于80%说明可能存在CPU不足
#!/bin/bash
mail='mail -s "cup报警" 70697410@qq.com'
DATE=`date "+%Y-%m-%d %H:%M:%S"`
MYIP=`ifconfig ens33 |grep "inet " |awk -F[:" "]+ '{ print $3 }'`
MASG="您的机器$MYIP于$DATE已经CUP使用过高,已经使用了:"
cpu_us=$(vmstat |awk '{print $13}' |sed -n '$p')
cpu_sy=$(vmstat |awk '{print $14}' |sed -n '$p')
cpu_id=$(vmstat |awk '{print $15}' |sed -n '$p')
cpu_sum=$(($cup_us + $cpu_sy))
if (( $cpu_sum >= 80 ))
then
echo "$MASG$cpu_sum%"| $mail
else
echo "$DATE:CPU资源已经消耗了$cpu_sum%"
fi
八:shell备份mysql数据库
#!/bin/bash
#backup_mysql
#2021-03-26
Mail= mail -s "MysqlDump fail " 70697410@qq.com
#备份目录
BackupDir=/home/backup
#共享目录,异机备份
SaveDir=/data/sdv1/backup
#当前日期时间
fdate=`date "+%Y-%m-%d"`
#设置目录属主和属组 赋权
chown -R mysql:mysql $BackupDir
chmod -R 775 $BackupDir
chmod -R 775 $SaveDir
#备份库
function test () {
echo "$fdate Begin backup test database" >> $BackupDir/backmysql.log
#判断目录是否存在 -d:存在即为真 !表否定
if [ ! -d $BackupDir/mysql ];then
mkdir -p $BackupDir/mysql
chown -R mysql:mysql $BackupDir/mysql
fi
#备份test库
mysqldump -uroot -p'rootroot' test > $BackupDir/mysql/test_"$fdate".sql
#$? 获取上条命令的执行返回值,正常为0。
if [ $? -eq 0 ];then
echo "$fdate backup test database success" >> $BackupDir/backmysql.log
else
echo "$fdate backup test database fail" >> $BackupDir/backmysql.log
echo "$fdate backup test database fail" | $Mail
fi
}
#压缩备份及删除
function compress () {
echo "$fdate Begin complete database " >> $BackupDir/backmysql.log
#压缩打包备份文件的目录
cd $BackupDir
tar -cf mysql_$fdate.tar mysql
#如果上条命令执行成功,则删除3天前的备份文件
if [ $? -eq 0 ];then
echo "$fdate complete done" >> $BackupDir/backmysql.log
find $BackupDir -mtime +3 -exec rm -rf{} \;
fi
#吧本地备份拷贝到异机备份,
cd $BackupDir
cp mysql_$fdate.tar $SaveDir
echo "$fdate cp date to savedir done " >> $BackupDir/backmysql.log
nuf=`find $SaveDir -name '*.tar' -size +10M|wc -l`
if [[ $? -eq 0 && $nuf -gt 3 ]];then
echo "$fdate delete nfs than 7 days" >> $BackupDir/backmysql.log
fi
echo "$fdate all is ok" >> $BackupDir/backmysql.log
cp -r $BackupDir/backmysql.log $SaveDir
}
test
compress