现在做运维的话,有的公司会有笔试,其中有一项就是要求 shell 脚本。今天给大家罗列 5 个大概率面试经常会碰到的 shell 脚本。
1、实现循环 ping,就是验证服务器通不通。-w 2 表示等待时间为 2 秒,-c 1 表示 ping 一次。
#!/bin/bash
for i in `seq 1 20`
do
if ping -w 2 -c 1 192.168.43.$i | grep "100%" > /dev/null;then
echo "192.168.43.$i is not reachable"
else
echo "192.168.43.$i is reachable"
fi
done
2、统计 nginx 日志中请求状态码总数以及异常状态码 4**和5**个数以及所占的百分比。
#!/bin/bash
pwd=/app/nginx/logs/access.log
for num1 in `cat $pwd | awk '{print $9}' | grep -Ei "^4|^5" | wc -l`
do
echo 异常状态码总数:$num1
for num2 in `cat $pwd | awk '{print $9}'| wc -l`
do
echo 请求状态码总数:$num2
k=$(echo "scale=2;$num1 * 100 / $num2"| bc)%
echo 异常百分比:$k
done
done
3、MySQL 自动备份。
#!/bin/bash
# Mysql vars
DB_USER="root"
DB_PASS='tigergao@123'
MYSQLDUMP_OPT="--opt --events --ignore-table=mysql.events --default-character-set=utf8"
# Others vars
DATE=`date +%Y%m%d_%H%M`
BIN_DIR="/usr/local/mysql/bin/"
BACK_DIR="/opt/backup_database/20190830"
# GET DB_NAMES
DB_NAMES=`${BIN_DIR}/mysql -u${DB_USER} -p${DB_PASS} -A -e "show databases;" | egrep -v "Database|schema"`
# Todo mysqldump
[ -d ${BACK_DIR} ] || mkdir -p ${BACK_DIR}
# mysqldump all databases
${BIN_DIR}/mysqldump ${MYSQLDUMP_OPT} -u${DB_USER} -p${DB_PASS} --all-databases | gzip > ${BACK_DIR}/all_databases_${DATE}.sql.gz
for DB_NAME in ${DB_NAMES}; do
sleep 1
DATE=`date +%Y%m%d_%H%M%S`
${BIN_DIR}/mysqldump ${MYSQLDUMP_OPT} -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${BACK_DIR}/${DB_NAME}_${DATE}.sql
# gzip backup
# ${BIN_DIR}/mysqldump ${MYSQLDUMP_OPT} -u${DB_USER} -p${DB_PASS} ${DB_NAME} | gzip > ${BACK_DIR}/${DB_NAME}_${DATE}.sql.gz
[ $? == 0 ] && echo "${DATE}:mysqldump ${DB_NAME} success." >>${BACK_DIR}/../mysqldump_backup.log || echo "${DATE}:mysqldump ${DB_NAME} err,please check." >>${BACK_DIR}/../mysqldump_backup.log
done
echo "==========All databases backups over==========" >>${BACK_DIR}/mysqldump_backup.log
4、某淘宝店卖4种物品:1.手机、2.游艇、3.摩托、4.鼠标。
购买前需要输入用户名和密码。
用户名:tigergao
密码:123456
当用户名和密码不对时,自动退出。
当用户名和密码正确时,进入淘宝店购买商品,可以选择一种自己想买的。
购买后,提示数字对应的商品购买成功。
#!/bin/bash
#auth tigergao
#date 2019-07-16
read -p "请输入你的姓名:" name
if [ $name == tigergao ];
then
read -p "请输入你的密码:" passwd
if [ $passwd == 123456 ];
then
echo "登陆成功!"
cat a.txt
read -p "请输入您要购买的物品:" a
echo `cat a.txt | grep $a | awk -F '.' '{print $1":"$2}'` "购买成功"
fi
else "账号密码错误"
fi
5、随机生成 1000 个服务器密码:要求包含大写字符,小写字母,数字和特殊字符。
#!/bin/bash
for i in `seq 1 1000`
do
i=$(strings /dev/urandom | grep -o '[0-9a-zA-Z!@#$%^&*()~_+<>?/`]' | head -n 10 | tr -d '\n' | egrep '[0-9]' | egrep '[a-z]' | egrep '[A-Z]' | egrep '[!@#$%^&*()~_+<>?/`]')
echo $i | grep -Ev "^$"
done
顺便再给大家留一个小问题,在 linux 下有那几个命令会实现创建文件呢?这是一道我曾经碰到过的面试题目。看似简单,但是面试官应该是想挖掘基础掌握的牢靠不牢靠。表面看起来简单,但或许不加思考回答上来的并不是面试官真正想要的。