面试前临时抱佛脚——常见的Shell脚本面试题
1 获取随机字符串或数字
获取随机8位字符串:
Method One
echo $RANDOM |md5sum |cut -c 1-8
Method Two
openssl rand -base64 4
Method Three
cat /proc/sys/kernel/random/uuid |cut -c 1-8
获取随机8位数字:
Method One
echo $RANDOM |cksum |cut -c 1-8
Method Two
openssl rand -base64 4 |cksum |cut -c 1-8
Method Three
date +%N |cut -c 1-8
2 定义一个颜色输出字符串函数
Method one
#!/bin/bashfunction echo_color() {if [ $1 == "green" ]; thenecho -e "\033[32;40m$2\033[0m"elif [ $1 == "red" ]; thenecho -e "\033[31;40m$2\033[0m"fi
}echo_color red "test"
Method Two
#!/bin/bashfunction echo_color() {case $1 ingreen)echo -e "\033[32;40m$2\033[0m";;red)echo -e "\033[31;40m$2\033[0m" ;;*) echo "Example: echo_color red string"esac
}
echo_color red "我爱你"
function关键字定义一个函数,可加或不加。
3 批量创建用户
#!/bin/bash
DATE=$(date +%F_%T)
USER_FILE=user.txt
echo_color(){if [ $1 == "green" ]; thenecho -e "\033[32;40m$2\033[0m"elif [ $1 == "red" ]; thenecho -e "\033[31;40m$2\033[0m"fi
}# 如果用户文件存在并且大小大于0就备份
if [ -s $USER_FILE ]; thenmv $USER_FILE ${USER_FILE}-${DATE}.bakecho_color green "$USER_FILE exist, rename ${USER_FILE}-${DATE}.bak"
fi
echo -e "User\tPassword" >> $USER_FILE
echo "----------------" >> $USER_FILE
for USER in user{1..10}; doif ! id $USER &>/dev/null; thenPASS=$(echo $RANDOM |md5sum |cut -c 1-8)useradd $USERecho $PASS |passwd --stdin $USER &>/dev/nullecho -e "$USER\t$PASS" >> $USER_FILEecho "$USER User create successful."elseecho_color red "$USER User already exists!"fi
done
4 检查软件包是否安装
[root@server shell]# cat install.sh
#!/bin/bash
if rpm -q $1 &>/dev/null; thenecho "$1 is already installed."
elseecho "$1 is not installed!"
fi
5 检查主机存活状态
#!/bin/bash
IP_LIST="172.25.6.250 172.25.6.1 172.25.6.2 114.114.114.114"
for IP in $IP_LIST; doNUM=1while [ $NUM -le 3 ]; doif ping -c 1 $IP > /dev/null; thenecho "$IP Ping is successful."breakelse# echo "$IP Ping is failure $NUM"FAIL_COUNT[$NUM]=$IPlet NUM++fidoneif [ ${#FAIL_COUNT[*]} -eq 3 ];thenecho "${FAIL_COUNT[1]} Ping is failure!"unset FAIL_COUNT[*]fi
done
6 监控CPU、内存和硬盘利用率
1)CPU
借助vmstat工具来分析CPU统计信息。
#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig eth0 |awk -F '[ :]+' '/inet addr/{print $4}') # 只支持CentOS6
MAIL="example@mail.com"
if ! which vmstat &>/dev/null; thenecho "vmstat command no found, Please install procps package." exit 1
fi
US=$(vmstat |awk 'NR==3{print $13}')
SY=$(vmstat |awk 'NR==3{print $14}')
IDLE=$(vmstat |awk 'NR==3{print $15}')
WAIT=$(vmstat |awk 'NR==3{print $16}')
USE=$(($US+$SY))
if [ $USE -ge 50 ]; thenecho "Date: $DATEHost: $IPProblem: CPU utilization $USE" | mail -s "CPU Monitor" $MAIL
fi
2)内存
#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig eth0 |awk -F '[ :]+' '/inet addr/{print $4}')
MAIL="example@mail.com"
TOTAL=$(free -m |awk '/Mem/{print $2}')
USE=$(free -m |awk '/Mem/{print $3-$6-$7}')
FREE=$(($TOTAL-$USE))
# 内存小于1G发送报警邮件
if [ $FREE -lt 1024 ]; thenecho "Date: $DATEHost: $IPProblem: Total=$TOTAL,Use=$USE,Free=$FREE" | mail -s "Memory Monitor" $MAIL
fi
3)硬盘
#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig eth0 |awk -F '[ :]+' '/inet addr/{print $4}')
MAIL="example@mail.com"
TOTAL=$(fdisk -l |awk -F'[: ]+' 'BEGIN{OFS="="}/^Disk \/dev/{printf "%s=%sG,",$2,$3}')
PART_USE=$(df -h |awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5),$6}')
for i in $PART_USE; doPART=$(echo $i |cut -d"=" -f1)USE=$(echo $i |cut -d"=" -f2)MOUNT=$(echo $i |cut -d"=" -f3)if [ $USE -gt 80 ]; thenecho "Date: $DATEHost: $IPTotal: $TOTALProblem: $PART=$USE($MOUNT)" | mail -s "Disk Monitor" $MAILfi
done
7 批量主机磁盘利用率监控
前提监控端和被监控端SSH免交互登录或者密钥登录。
写一个配置文件保存被监控主机SSH连接信息,文件内容格式:IP User Port
#!/bin/bash
HOST_INFO=host.info
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); doUSER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)TMP_FILE=/tmp/disk.tmpssh -p $PORT $USER@$IP 'df -h' > $TMP_FILEUSE_RATE_LIST=$(awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5)}' $TMP_FILE)for USE_RATE in $USE_RATE_LIST; doPART_NAME=${USE_RATE%=*}USE_RATE=${USE_RATE#*=}if [ $USE_RATE -ge 80 ]; thenecho "Warning: $PART_NAME Partition usage $USE_RATE%!"fidone
done
8 检查网站可用性
1)检查URL可用性
方法1:
check_url() {HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1)if [ $HTTP_CODE -ne 200 ]; thenecho "Warning: $1 Access failure!"fi
}
check_url www.baidu.com方法2:
check_url() {
if ! wget -T 10 --tries=1 --spider $1 >/dev/null 2>&1; then
#-T超时时间,--tries尝试1次,--spider爬虫模式echo "Warning: $1 Access failure!"fi
}
check_url www.baidu.com
2)判断三次URL可用性
思路与上面检查主机存活状态一样。
方法1:利用循环技巧,如果成功就跳出当前循环,否则执行到最后一行
#!/bin/bash
check_url() {HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1)if [ $HTTP_CODE -eq 200 ]; thencontinuefi
}
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; docheck_url $URLcheck_url $URLcheck_url $URLecho "Warning: $URL Access failure!"
done
方法2:错误次数保存到变量
#!/bin/bash
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; doFAIL_COUNT=0for ((i=1;i<=3;i++)); doHTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)if [ $HTTP_CODE -ne 200 ]; thenlet FAIL_COUNT++elsebreakfidoneif [ $FAIL_COUNT -eq 3 ]; thenecho "Warning: $URL Access failure!"fi
done
方法3:错误次数保存到数组
#!/bin/bash
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; doNUM=1while [ $NUM -le 3 ]; doHTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)if [ $HTTP_CODE -ne 200 ]; thenFAIL_COUNT[$NUM]=$IP #创建数组,以$NUM下标,$IP元素let NUM++elsebreakfidoneif [ ${#FAIL_COUNT[*]} -eq 3 ]; thenecho "Warning: $URL Access failure!"unset FAIL_COUNT[*] #清空数组fi
done
9 检查MySQL主从同步状态
#!/bin/bash
USER=bak
PASSWD=123456
IO_SQL_STATUS=$(mysql -u$USER -p$PASSWD -e 'show slave status\G' |awk -F: '/Slave_.*_Running/{gsub(": ",":");print $0}') #gsub去除冒号后面的空格
for i in $IO_SQL_STATUS; doTHREAD_STATUS_NAME=${i%:*}THREAD_STATUS=${i#*:}if [ "$THREAD_STATUS" != "Yes" ]; thenecho "Error: MySQL Master-Slave $THREAD_STATUS_NAME status is $THREAD_STATUS!"fi
done
面试前临时抱佛脚——常见的Shell脚本面试题相关推荐
- (13)FPGA面试技能提升篇(Shell脚本)
1.1 FPGA面试技能提升篇13(Shell脚本) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试技能提升篇13(Shell脚本): 5)结束语. 1.1 ...
- shell for循环命令行_精心汇总的24道shell脚本面试题
虽然现在Python在运维工作中已经使用很普遍,但是很多企业在找Linux云计算工程师的时候还是会问到 shell 脚本的问题,它有助于你在工作环境中自动完成很多任务. 如下是一些面试过程中,经常会遇 ...
- shell for循环命令行_24 道 shell 脚本面试题
想要成为中高级phper, shell 脚本是需要掌握的,它有助于你在工作环境中自动完成很多任务. 如下是一些面试过程中,经常会遇到的 shell 脚本面试问题及解答: Q:1 Shell脚本是什么. ...
- shell脚本面试题
Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件( ...
- 初级软件测试面试前需要做什么准备?面试题可以去哪里找?
最近几年,随着电子产品和互联网的蓬勃发展,各类科技公司如雨后春笋般出现,而软件公司作为科技类公司中的重要组成部分,在这支互联网大军中也占据了重要一席.因而,负责软件问题质检的软件测试岗位也逐渐成了这几 ...
- java面试上机_常见的Java上机面试题
常见的 Java 上机面试题 在程序员面试中, 主要的考试形式分为笔试和上机编程考试两部分. 笔试主要考查面试者的 基础是否牢固:上机考试主要考查面试者的实际开发能力和技术技巧. 上机编程考试,要求面 ...
- 面试前必须要知道的Redis面试题
前言 回顾前面: 从零单排学Redis[青铜] 从零单排学Redis[白银] 从零单排学Redis[黄金] 从零单排学Redis[铂金一] 从零单排学Redis[铂金二] Redis 今天来分享一下R ...
- Linux–shell脚本
知识点和问题 1.Shell是什么 2.Shell编程快速入门 3.Shell的变量 4.Shell变量的定义 5.定义变量的规则 6.将命令的返回值赋给变量 7.设置环境变量 8.位置参数变量 9. ...
- 几种常见的Shell
上面提到过,Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把它们称作一种Shell.我们常说 ...
最新文章
- 无限极:对虚假宣传行为查处不力 推十条整改措施
- java foreach 删除_为什么java不要在foreach循环里进行元素的remove/add操作
- 阿里云centos 7.6安装mysql_阿里云服务器中Linux下centos7.6安装mysql8.0.11
- 个人阅读的Deep Learning方向的paper整理
- GDCM:gdcm::Image的测试程序
- php判断当前时间是否跨月,判断日期是否能跨月查询的js代码_javascript技巧
- How to get ABAP code coverage result
- 常见Orcale报错问题解决办法
- CF1110E-Magic Stones【结论题,差分】
- Spring bean 不被 GC 的真正原因
- C++ 重载数学运算符
- fckeditor零碎要点---3.FCK:editor instanceName=myeditor value=李德伟欢迎您 height=400/FCK:editor
- java调用hp打印机驱动_惠普打印机驱动修改JDK问题–现象:javac不能用了 | 学步园...
- juniper防火墙策略元素
- 设置或者获取CheckboxList控件的选中值
- 基础集合论 第一章 7 交集 8 差集
- wxWindows 第一个Frame程序
- python数据分析百度云资源_数据分析师视频教程百度云网盘下载
- HTML语法结构及规范
- html中加js弹窗,前端html+css+js弹窗的实现
热门文章
- R语言ggplot2可视化(facet图)使得第一个子图的坐标轴范围一致
- Python中pandas检查dataframe中是否包含某个字段、或者数据列实战、检查dataframe中是否包含某个字段集合
- R语言nrow函数获取dataframe或者matrix行计数统计
- 推荐系统+覆盖率(coverage)
- Keras训练神经网络进行分类并使用GridSearchCV进行参数寻优
- 数据挖掘应用于流失分析的整体思路
- 广东深圳计算机学校排名2015年,2015年深圳小学综合排名 各区小学最新排名
- Ajax基础和Json基础
- 【英文文本分类实战】之三——数据清洗
- SRTP是如何工作的