Shell编程面试题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell编程面试题相关的知识,希望对你有一定的参考价值。

shell习题

求100以内之和的shell脚本

#!/bin/bash
#Author  Wangweigang
#Create Time 2018-11-06
#Name sum 1-100
sum=0
for i in `seq 1 100`
do
    sum=$[$i+$sum]
done
echo $su

计算使用的内存使用量

#/bin/bash
free=$(free |awk ‘NR==2{print ($3)/$2*100"%"}‘)
if
  [ ${free%.*} -ge 10 ];then
   echo "内存使用大于10,现在内存为$free"
else
   echo "内存为 $free"
fi

Shell练习题目

1.按照时间生成文件2018-05-22.log将每天的磁盘使用状态写入到对应的文件

分析
1.时间打印 date +%F
2.磁盘状态 df -h

#!/bin/bash
echo "`df -h`" >`date +%F`.log 

2.统计nginx日志中每个IP的访问量有多少,日志如下:

192.168.56.1 - - [21/May/2018:20:44:06 -0400] "GET /index.html HTTP/1.0" 404 169 "-" "ApacheBench/2.3" "-"/code/index.html
分析
1.筛选所有的IP地址
c2.排序、去重、统计

cat /var/log/nginx/access.log |awk ‘{print $1}‘|sort -u|uniq -c

3.写一个脚本计算一下Linux系统所有进程占用内容大小的和。

分析
1.如何获取内存的大小 top、ps
2.如何统计大小之和

ps aux |tail -n +2 |awk ‘{sum+=$6} END{print sum/1024"MB"}‘
ps aux |tail -n +2 |awk ‘{sum+=$5} END{print sum/1024"MB"}‘

4.找到/backup目录下所有后缀名为.txt的文件

1.批量修改txt为txt.bak
2.把所有的.bak文件打包压缩为123.tar.gz
3.批量还原文件的名字,及把增加的.bak再删除
分析
1.使用find命令进行查找
2.使用mv命令进行移动改名
3.使用tar命令进行打包

find /backup/ -type f -name ".txt" > /tmp/1.txt
for i in $(cat /tmp/1.txt)
do
mv $i ${i}.bak
done
#2.重新查找,bak文件,然后进行打包
cd /backup && tar czf 123.tar.gz $(find /backup/ -type f -name "
.bak")

#3.将.bak还原.txt
find /backup/ -type f -name ".bak" >/tmp/2.txt
for i in $(cat /tmp/2.txt)
do
mv $i ${i%.
}
done

5.写一个脚本,判断本机80端口(假如服务为httpd)是否开启,如果开启什么都不干, 如果发现端口不存在,那么重启一下http服务,并发邮件通知自己,脚本写好后可以每分钟执行一次,也可以写一个死循环

>分析
    1.检测80端口是否正常  netstat -lntp|grep ":80"
    2.如果不正常则重启Nginx
    3.如果进程是启动的则重启,否则直接启动
    status=$(netstatu -lntp )
    [[email protected] scripts]# cat status_httpd.sh 
#!/bin/bash
export PATH=$PATH
#写一个脚本,判断本机80端口(假如服务为httpd)是否开启,如果开启什么都不干, 如果发现端口不存在,那么重启一下http服务,并发邮件通知自己,脚本写好后可以每分钟执行一次,也可以写一个死
Status_httpd=$(netstat -lntp |grep ":80" |wc -l)
Cq="`systemctl restart httpd`"
Zt="`netstat -lntp`"
if
 [ $Status_httpd -gt 0 ];then 
    echo "Httpd正常运行"
else
    echo "Httpd是未开启的马上重Qi,请查看!"
    echo $Cq #|mail -s "httpd start" [email protected]
    echo $Zt
fi

6.现在有一个lnmp环境, 经常出现502错误, 只要一重启php-fpm即可解决,如果不重启则会持续非常长的一段时间,所有有必要写一个监控脚本,监控访问日志的状态码,一旦发生502,则自动重启一下php-fpm

>分析
    1.通过日志尾部最后300行,统计502出现的次数
    2.精准判断是否是502错误,不是则不处理,是则重启php-fpm
    sort :默认是按ASCII码进行排序的
常用选项:
-n :按数值大小排序
 -r: 倒叙排列
 -k: 指定字段排序
 -t: 指定分割符
 -u: 去掉重复
例如:sort -nk3 -t: /etc/passwd
cat /proc/cpuinfo |grep ‘ physical id‘ |sort -u |wc -l
uniq: 去重,这里的去重指的是相邻行,才会去重
-d: 只显示重复的行
-D: 把所有重复的行都显示出来
-c:显示每行重复的次
    tail -300 /var/log/nginx/access.log | awk ‘{print $9}‘|sort -n|uniq -c

7用shell打印下面这句话中字母数小于6个的单词Bash also interprets a number of multi-user optios

>分析
    1.使用循环遍历
    2.怎么统计单词数值 wc -c
#!/bin/bash
for s in Bash also interprets a number of multi-character options
do
  n=`echo $s |wc -c`
  if [ $n -lt 6 ]
  then
     echo $s
  fi
done

8.添加user_00->user_0910个用户, 并且给他们设置一个随机密码, 密码要求10位包含大小写字母以及数字, 注意需要把每个用户的密码记录到一个日志文件中

>分析
    1.怎么实现00-09思路`echo user_{00..10}   seq -w 0 10`
    2.随机密码`mkpasswd( yum install expect)`
    [[email protected] scripts]# cat Create_user.sh 
#!/bin/bash
#Create Time 2018-11-07
export PATH=$PATH
for i in user_{00..10}
do
useradd $i
pass=`mkpasswd -l 10 -s 0`
echo $pass |passwd --stdin $i
echo $pass $i >> /tmp/pass.log
done

9.写个shell看看你的linux系统中是否有自定义用户(普通用户),若有一共有多少个?

>分析
    1.查看/etc/passwd文件
    2.只有UID大于1000的都是普通
    cat /etc/passwd|awk -F ":" ‘{print "$3}‘
    [[email protected] scripts]# cat /etc/passwd |awk -F : ‘$3>1000&& $3!=65534 {print $0}‘ 
user_01:x:1001:1001::/home/user_01:/bin/bash
user_02:x:1002:1002::/home/user_02:/bin/bash
user_03:x:1003:1003::/home/user_03:/bin/bash
user_04:x:1004:1004::/home/user_04:/bin/bash
user_05:x:1005:1005::/home/user_05:/bin/bash
user_06:x:1006:1006::/home/user_06:/bin/bash
user_07:x:1007:1007::/home/user_07:/bin/bash
user_08:x:1008:1008::/home/user_08:/bin/bash
user_09:x:1009:1009::/home/user_09:/bin/bash
user_10:x:1010:1010::/home/user_10:/bin/bash

10.写一个shell脚本,检测所有磁盘分区使用率和inode使用率,并记录到以当天时间命名的日志文件中,当发现某个分区容量或inode使用量大于85%时,发邮件通知自己

>分析
    1.打印当前磁盘inode和使用率至文件中
    2.取值判断是否使用率超过85%
    3.发邮件通知自己(/tmp/error.txt)
#!/bin/bash
log=/var/log/disk/`date +%F`.log
date +‘%F %T‘ > $log
df -h >> $log
echo >> $log
df -i >> $log

for i in `df -h|grep -v ‘Use%‘|sed ‘s/%//‘|awk ‘{print $5}‘`; do
    if [ $i -gt 85 ]; then
        use=`df -h|grep -v ‘Use%‘|sed ‘s/%//‘|awk ‘$5==‘$i‘ {print $1,$5}‘`
        echo "$use" >> use
    fi
done
if [ -e use ]; then

   ##这里可以使用咱们之前介绍的mail.py发邮件
    mail -s "Filesystem Use% check" [email protected] < use
    rm -rf use
fi

for j in `df -i|grep -v ‘IUse%‘|sed ‘s/%//‘|awk ‘{print $5}‘`; do
    if [ $j -gt 85 ]; then
        iuse=`df -i|grep -v ‘IUse%‘|sed ‘s/%//‘|awk ‘$5==‘$j‘ {print $1,$5}‘`
        echo "$iuse" >> iuse
    fi
done
if [ -e iuse ]; then
    mail -s "Filesystem IUse% check" [email protected] < iuse
    rm -rf iuse
fi

11.写一个shell脚本来看看你使用最多的命令是那些,列出常用的命令top10

>分析
    1.拿到想要的值,排序、去重、统计
    [[email protected] scripts]# history |awk ‘{print $2}‘|sort -u|tail -10

12.写一个脚本判断你的Linux服务器里是否开启web服务, 如果开启了请判断跑的是什么服务,是httpd还是nginx又或是其他?

>分析
    1.使用`netstat`查看是否存在80
    2.筛选80端口对应的是`nginx`还是`httpd`
#!/bin/bash
 port=`netstat -lnp | grep 80`
 if [ -z "port" ]; then
     echo "not start service.";
     exit;
 fi
 web_server=`echo $port | awk -F‘/‘ ‘{print $2}‘|awk -F : ‘{print $1}‘` 
case $web_server in
   httpd ) 
       echo "apache server."
   ;;
   nginx )
       echo "nginx server."
   ;;
   * )
       echo "other server."
   ;; 
esac

13.当前mysql服务的root密码为123456写脚本检测mysql服务是否正常(比如,可以正常进入mysql执行show processlist),并检查一下当前的MySQL服务是主还是从,如果是从,请判断他的主从服务是否异常,如果是主,则不需要做什么

>分析
1.使用非交互的方式登录mysql进行取值 mysql -h -u -p -e
2.检查主从, 如果是主则返回空,如果是从则返回数值(show slave statusG)
3.检查从的IO线程和SQL线程是否正常。
#!/bin/bash
Mysql_c="mysql -uroot -p123456"
$Mysql_c -e "show processlist" >/tmp/mysql_pro.log 2>/tmp/mysql_log.err
n=`wc -l /tmp/mysql_log.err|awk ‘{print $1}‘`

if [ $n -gt 0 ]
then
    echo "mysql service sth wrong."
else

    $Mysql_c -e "show slave statusG" >/tmp/mysql_s.log
    n1=`wc -l /tmp/mysql_s.log|awk ‘{print $1}‘`

    if [ $n1 -gt 0 ]
    then
        y1=`grep ‘Slave_IO_Running:‘ /tmp/mysql_s.log|awk -F : ‘{print $2}‘|sed ‘s/ //g‘`
        y2=`grep ‘Slave_SQL_Running:‘ /tmp/mysql_s.log|awk -F : ‘{print $2}‘|sed ‘s/ //g‘`

        if [ $y1 == "Yes" ] && [ $y2 == "Yes" ]
        then
            echo "slave status good."
        else
            echo "slave down."
        fi
    fi
fi

14.写一个脚本, 计算100以内能被3整除的正整数之和

>分析
    1.先找出1-100能除以3等于0的数值
    2.让数值进行相加
    [[email protected] scripts]# cat 14.sh 
#/usr/bin/bash
#Authro Wangweigang
#Create Time 2018-11-06
#100以内能被3整除的数字之和。
sum=0
for i in {1..100};do
    if [ $[$i%3] -eq 0 ];then
    sum=$[$i+$sum]
     fi
done
echo "sum is =$sum"

15.提示用户输入网卡名字,然后我们用脚本输出网卡的IP

>分析
    1.需要读入用户输入的网卡名称
    2.判断输入的网卡名称是否正确
    3.判断网卡是否有IP地址,有则输出,没有则提示
#!/bin/bash
#Authro Wangweigang
#Create Time 2018-11-08
cat <<END
web1 10.0.0.7
web2 10.0.0.8
web3 10.0.0.9
nfs  10.0.0.31
backup 10.0.0.41
mo1 10.0.0.61
END
while true
web1=$(ifconfig eth0 |awk ‘NR==2{print $2}‘)
read -p "Please Input Network " hostname
do
if
  [ $hostname -eq 1 ];then
    echo "10.0.0.7"
elif
  [ $hostname -eq web2 ];then
    echo "10.0.0.8"
elif
  [ $hostname -eq web3 ];then
    echo "10.0.0.9"
elif 
  [ $hostname -eq m01 ];then
    echo "10.0.0.61"
elif
  [ $hostname -eq nfs ];then
    echo "10.0.0.31"
elif
  [ $hostname -eq backup ];then
    echo "10.0.0.41"
else 
    echo "您输入的用户名不存在"
exit
fi
done

16.写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小

猜苹果是多少钱一斤
>分析
    1.随机数字如何生成
    2.死循环,直到猜对才退出
    3.判断大小
    #!/bin/bash
num=$(echo $(($RANDOM%100+1)))
while true
do 
 read -p "Please Input number:" number
if [ $number -gt $num ];then
   echo "你输入的数字太大了!!"
elif [ $number -lt $num ];then
    echo "你输入的数字太小了!!"
else
    echo "恭喜你猜中了^^^"
exit 666
fi
done    

17.写一个脚本判断输入的用户是否登入,如果未登陆提示没有登陆,如果登陆,显示登陆的终端以及通过那个IP登陆过来的

>分析
    1.使用w获取当前所有登陆系统的用户
    2.判断
    #!/usr/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

read -p "请输入用户名称:" A
Are=`awk -F: ‘$3<1||$3>999{print $1}‘ /etc/passwd|grep "^${A}$"|wc -l`
User=$(who|grep "$A"|wc -l)

case $Are in
    0)
    echo "$A 这个用户不存在"
    ;;
    1)
    [ $User -eq 0 ] && echo "$A 未登录" || who|awk ‘/‘$A‘/{print $"	"$2"	"$NF}‘
esac

18.写一个shell先判断是否安装httpmysql没有安装进行安装,安装了检查是否启动服务,若没有启动则需要启动服务。

>分析
    1.使用rpm命令判断是否安装对应的软件
    2.检查是否启动(ssytemctl|ps)

19.写一个shell脚本,通过curl -l返回的状态码来判断所访问的网站是否正常,比如:当状态码为200|301|302时,才算正常

>分析
    1.获取状态码的关键值
    2.根据状态进行判断即可
    [[email protected] scripts]# cat status_num.sh 
#!/bin/bash
export PATH=$PATH
Status_Num=$(curl -I -m 10 -o /dev/null -s -w %{http_code} www.baidu.com)
if 
  [ $Status_Num -eq 200 ]||[ $Status_Num -eq 302 ]||[ $Status_Num -eq 301 ];then
    echo "此网站的状态码为:$Status_Num"
else
    echo "状态有误请查看当前状态码:$Status_Num 的状态码的错误"
fi

20.已知Nginx访问的日志文件在/var/log/nginx/access.log请统计下早上10点到早上12点来访IP最多的是哪个?

grep -E ‘30/Oct/2018:1[0-2]:[0-5][0-9]:/var/log/nginx/access.log |awk ‘{print $1}‘ |sort -n |uniq -c |head -n1

=======================================================================================

1、中企动力面试题

https://blog.csdn.net/u010230971/article/details/80335522
用shell处理以下内容
1、按单词出现频率降序排序!
2、按字母出现频率降序排序!
the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation
str="the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"
#no1按单词出现的频率降序排序
word(){
  echo $str|sed ‘s#[^a-zA-Z]#
#g‘|grep -v "^$"|sort|uniq -c|sort -rn -k1
}

#no2按字母出现的频率降序排序
string(){
  echo $str|grep -o "."|egrep -v "[^a-zA-Z]"|sort|uniq -c|sort -rn -k1
}

menu(){
  cat <<END
  1.按单词出现的频率降序排序
  2.按字母出现的频率降序排序
END
  read -p "Pls you choose num:" num
}
menu

usage(){
  echo "USAGE:You muset choose 1 or 2"
  exit 1
}

case "$num" in
  1)
    word
    ;;
  2)
    string
    ;;
  *)
    usage
esac

2、企业面试题

已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?

21029299
00205d1c
a3da1677
1f6d12dd
解答:利用random的范围(0-32767)
for ((i=0;i<=32767;i++))
do
     for j in `cat /server/scripts/ab.txt`
     do

           if [[ "$(echo $i|md5sum)" =~ "${j}" ]]
        then
        echo  $i
       fi
     done
done
for ((i=0;i<=32767;i++))
do
     for j in `cat /server/scripts/ab.txt`
     do
           #echo "$(echo $i|md5sum|cut -c 1-8)    ${j}"
           if [ "$(echo $i|md5sum|cut -c 1-8)" == "${j}" ]
        then
        echo  $i
       fi
     done
done

利用数组来做

#!/bin/sh
a=(21029299
00205d1c
a3da1677
1f6d12dd)
for n in {0..32767}
do
        random=`echo $n|md5sum|cut -c1-8`
        for((i=0;i<=${#a[@]};i++))
        do
          if [ "$random" == "${a[i]}" ];then
          echo "$n" "${a[i]}"
        fi
        done
done

3、使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为:

tr -dc 的意思是,将字符串中a到z 以外的字符提取并删除,只保留小写字母
#!/bin/bash
dir=/oldboy
[ ! -d $dir ] && mkdir -p $dir

for((i=1;i<=10;i++ ))
do
a=`tr -dc "a-z"  < /dev/urandom | head -c 10`_oldboy,html
  touch $dir/$a
done
for i in `seq 10`;do a=`echo $RANDOM|md5sum|tr "0-9" "j-z"|cut -c1-10`;touch ${a}_oldboy.html;done

4、请用至少两种方法实现!

将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写。

rename _oldboy.html _oldgirl.HTML *
#!/bin/bash
cd /root/oldfile
for a in `ls`
do
 b=`echo $a|sed ‘s/oldboy.html/oldgirl.HTML/g‘`
 mv $a $b
done

#!/bin/bash
cd /root/oldfile

for a in ls
do
b=echo $a|awk -F ‘_‘ ‘{print $1}‘
mv $a $b_oldgirl.HTML
done

5、写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些(方法有很多)

[[email protected] ~]# cat ping.sh 
#!/bin/sh
for i in {1..254}
do
    {
    IP=10.0.0.$i
    ping -c1 $IP &>/dev/null
    if [ $? -eq 0 ];then
    echo "$IP" >>ip.txt
    fi
    }&
done

wait
  echo "全部已经完
#!/bin/bash

subnet=10.0.0.0/24
#方法一
netaddr=`echo $subnet|cut -d. -f1-3`
for i in {1..254};do
{
ping -c 1 -t 1 $netaddr.$i > /dev/null
if [ $? == 0 ];then
 echo $netaddr.$i
fi
} &
done
wait

#方法二

nmap -sP $subnet
#!/bin/bash
for I in `seq 1 255`
do
        ping -c 1 10.0.0.$I &>/dev/null
        if [ $? -eq 0 ]
        then
                echo -e "10.0.0.$I is up."
        else
                echo -e "10.0.0.$I is down."
        fi
done

6、请用至少两种方法实现!循环、数组方式

for循环打印下面这句话中字母数不大于6的单词(昆仑万维面试题)。
I am oldboy teacher welcome to oldboy training class.
for s in I am oldboy teacher welcome to oldboy training class.
do
  n=`echo $s |wc -c`
  if [ $n -lt 6 ]
  then
     echo $s
  fi
done
#!/bin/bash
len=6
words=‘I am oldboy teacher welcome to oldboy training class.‘
#方法二
for word in ${words[@]};do
l=$(echo $word|wc -c)
if [ $l -gt $len ];then echo $word;fi
done

#方法三
for word in ${words[@]};do
l=$(echo $word|awk ‘{print length($0)}‘)
if [ $l -gt $len ];then echo $word;fi
done

#方法四

echo "I am oldboy teacher welcome to oldboy training class."|xargs -n1|awk ‘{if(length<6)print}‘

#方法五

echo "I am oldboy teacher welcome to oldboy training class."|awk ‘{for(i=1;i<=NF;i++)if(length($i)<6)print $i}‘

7、开发shell脚本分别实现以脚本传参以及read读入的方式比较2个整数大小。以屏幕输出的方式提醒用户比较结果。当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数做判断。

#!/bin/bash
#read读参
IFS=‘,‘
compare() {
n1=$1
n2=$2
if [ $n1 -ge $n2 ];then
[ $n1 -eq $n2 ] && echo "$n1 = $n2" || echo "$n1 > $n2"
else
echo "$n1 < $n2"
fi
}
isnum() {
num=$1
for n in ${num[@]};do
 if [[ ! $n =~ ^[0-9]+$ ]];then
  echo ‘WARNING: 必须输入整数!‘
  return 1
 fi
done
}
while :;do
read -a num -p "请输入2个整数(逗号分隔): "
if [ ${#num[@]} -ne 2 ];then
 echo ‘WARNING: 必须输入2个整数!‘
 continue
fi
isnum $num && compare ${num[@]}
done
#!/bin/bash
# 脚本传参
compare() {
n1=$1
n2=$2
if [ $n1 -ge $n2 ];then
[ $n1 -eq $n2 ] && echo "$n1 = $n2" || echo "$n1 > $n2"
else
echo "$n1 < $n2"
fi
}

isnum() {
num=$1
for n in ${num[@]};do
 if [[ ! $n =~ ^[0-9]+$ ]];then
  echo ‘WARNING: 必须输入整数!‘
  exit 2
 fi
done

}
if [ $# -ne 2 ];then
echo ‘WARNING: 必须输入2个整数!‘
exit 1
fi
isnum "$*" && compare [email protected]

===========================================================

解法2老师讲

#!/bin/bash
read -p "please input two Number: " -a Arr_str
echo ${Arr_str[*]} | grep -E "^[0-9 ]{1,}$" &>/dev/null || exit 
if [ ${#Arr_str[*]} -eq 2 ];then
   if [ ${Arr_str[0]} -eq ${Arr_str[1]} ];then
        echo "${Arr_str[0]} == ${Arr_str[1]}"
   elif [ ${Arr_str[0]} -gt ${Arr_str[1]} ];then
        echo "${Arr_str[0]} > ${Arr_str[1]}"
   else
        echo "${Arr_str[0]} < ${Arr_str[1]}"
   fi
else
    echo "please input two Number" 
fi

8、面试及实战考试题:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次。

首先,思想过程更重要。
什么是恶意篡改,只要未经过许可改动的都是篡改。
文件被改了,会有特征。 
a. 大小可能会变化。 
b. 修改时间会变化,(文件测试符ot,nt) 
c. 文件内容会变化,md5sum指纹 
d. 增加或删除文件
find /var/www/html -type f |xargs md5sum >/tmp/md5list
[[email protected] ~]# mkdir -p /var/www/html
[[email protected] ~]# touch /var/www/html/{a..k}
[[email protected] ~]# ls /var/www/html
a  b  c  d  e  f  g  h  i  j  k
[[email protected] ~]# find /var/www/html -type f |xargs md5sum >/tmp/md5list
[[email protected] ~]# cat /tmp/md5list
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/h
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/d
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/f
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/b
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/k
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/c
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/i
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/a
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/e
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/j
d41d8cd98f00b204e9800998ecf8427e  /var/www/html/g
#用md5sum测试文件是否有问题
[[email protected] ~]# md5sum -c /tmp/md5list
/var/www/html/h: OK
/var/www/html/d: OK
/var/www/html/f: OK
/var/www/html/b: OK
/var/www/html/k: OK
/var/www/html/c: OK
/var/www/html/i: OK
/var/www/html/a: OK
/var/www/html/e: OK
/var/www/html/j: OK
/var/www/html/g: OK

#修改文件后检测
[[email protected] ~]# echo 1111 > /var/www/html/a 
[[email protected] ~]# md5sum -c /tmp/md5list
/var/www/html/h: OK
/var/www/html/d: OK
/var/www/html/f: OK
/var/www/html/b: OK
/var/www/html/k: OK
/var/www/html/c: OK
/var/www/html/i: OK
/var/www/html/a: FAILED
/var/www/html/e: OK
/var/www/html/j: OK
/var/www/html/g: OK
md5sum: WARNING: 1 of 11 computed checksums did NOT match
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
故在此基础上我们可以写个脚本来监控目录中是否有文件被篡改,我把发邮件的给注释掉了

[[email protected] scripts]# cat monitor.sh 
#!/bin/bash

Path=/var/www/html
md5file=/tmp/md5list
md5check_safety=/tmp/md5check_safety
md5check_failed=/tmp/md5check_failed
check_result=`md5sum -c $md5file |grep FAILED|wc -l`

if [ $check_result -eq 0 ]; then
  echo "$(date +%F) $Path is security." >>$md5check_safety
#mail -s "md5check result" "[email protected]" <$md5check_safety
else
  echo "$(date +%F) $Path was changed." >>$md5check_failed
#mail -s "md5check result" "[email protected]" <$md5check_failed
fi

#在上边实验的基础上我们来测试
[[email protected] scripts]# cat /tmp/md5check_failed 
2018-08-24 /var/www/html was changed.

9、老男孩教育天津项目学生实践抓阄题目:

好消息,老男孩培训学生外出企业项目实践机会(第6次)来了(本月中旬),但是,名额有限,队员限3人(班长带队)。

因此需要挑选学生,因此需要一个抓阄的程序:
要求:
1、执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字。
2、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别的学生输入,抓完输入exit退出。
#!/bin/bash
output=/tmp/result
rand_num() {
 min=$1
 max=$2
 echo $(($RANDOM%$max+$min))
}

touch $output
while :;do
 read -p ‘输出名字全拼: ‘ name
 while :;do
  r=$(rand_num 1 99)
  count=$(grep -w -c $r $output)
  if [ $count -eq 0 ];then
   echo $name:$r|tee -a $output
   break/exit
  fi
 done
done

解法2老师讲

#!/bin/sh
touch /tmp/b.log
while true
do
while true
do
    ran=`echo $((RANDOM%100))`
    if [ `grep -w $ran /tmp/b.log|wc -l` -eq 1 ];then
    ran=`echo $((RANDOM%100))`
    else
    break
    fi
    done
    read -p "请输入你姓名的拼音: " name
    if [ "$name" == "exit" ];then

       echo "抓阄结束,结果如下"
    break
    else
    echo "$name" "$ran"
    echo -e "$name	$ran" >>/tmp/b.log
    fi
done
sort -rn -k2 /tmp/b.log|head -n3

10、计算从1加到100之和

#!/bin/sh
j=0
for((i=0; i<=100; i++))
do
    ((j=j+i))
done
echo $j
#!/bin/bash
sum=0
i=1
for i in `seq 100`
do
   let sum=sum+i
done
echo $sum

以上是关于Shell编程面试题的主要内容,如果未能解决你的问题,请参考以下文章

那个面试官好像一条狗运维面试题之linux编程

合格linux运维人员必会的30道shell编程面试题及讲解

合格linux运维人员必会的30道shell编程面试题及讲解

合格linux运维人员必会的30道shell编程面试题及讲解-11

面试题:shell脚本编程中grepsedawk命令详解

合格linux运维人员必会的30道shell编程面试题及讲解-08