20道Shell编程阶段考试题及答案

考试题 1:用source 执行脚本和用bash 执行 Shell 脚本的区别是什么?

考试题 2:定义变量内容,不加引号、单引号、双引号、反引号有什么区别?

考试题 3:写出特殊变量对应的意义及应用

image.png

考试题 4:写出下面特殊变量扩展的意义

image.png

考试题 5:通过脚本传参的方式,检查Web 网站 URL 是否正常(要求主体使用函数)。

. /etc/init.d/functions
check_url(){
    wget -q -o /dev/null -T 2 --tries=1 --spider $1
    if [ $? -eq 0 ]
    then
        action "$1 is ok" /bin/true
    else
        action "$1 is no" /bin/false
    fi
}
usage(){
    echo "Usage: $0 url"
}
main(){
    if [ $# -ne 1 ]
    then
        usage
    fi
    check_url $1
}
main $*

考试题 6:开发 Nginx 服务(编译安装)启动停止脚本,并分别通过
chkconfig(CentOS6) 和 systemctl(CentOS7)实现开机自启动。

centos 6:
. /etc/init.d/functions
 }
 start(){
     /application/nginx/sbin/nginx &>/dev/null
     if [ `netstat -lntup |grep nginx|wc -l` -eq 0 ]
     then
         action "nginx 开启失败" /bin/false
     else
         action "nginx 开启成功" /bin/true
     fi
 }       
     if [ `netstat -lntup |grep nginx|wc -l` -eq 0 ]
     then
         action "nginx 关闭成功" /bin/true
     else
         action "nginx 关闭失败" /bin/false
     fi
 }       
 restart(){
     /application/nginx/sbin/nginx -s stop &>/dev/null
     /application/nginx/sbin/nginx &>/dev/null
     if [ `netstat -lntup |grep nginx|wc -l` -eq 0 ]
     then
         action "nginx 重启失败" /bin/false
     else
         action "nginx 重启成功" /bin/true
     fi
 }       
 case $1 in
     start)
         start
         ;;
     stop)
         stop
         ;;
     restart)
         restart
         ;;
     *)
         usage
         ;;
 esac
centos 7:
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/etc/init.d/nginxd2 start
ExecReload=/etc/init.d/nginxd2 restart
ExecStop=/etc/init.d/nginxd2 stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target

考试题 7:猜数字游戏。首先让系统随机生成一个数字,给这个数字定一个范围(1-60),
让用户输入猜的数字,对输入进行判断,如果不符合要求,就给予高或低的提示,猜对后则给出猜对用的次数。

sum=$((RANDOM%61))
cishu=0
echo "猜数字游戏,猜对有奖励"
function duru(){
read -p "请输入你心中想的数字" a
if [[ ! $a =~ [0-9]+ ]]                                                                                                               
then
    echo "别闹,请输入数字,再来一次吧"
    sleep 1
    duru
fi
           }
           function cai(){
           ((cishu++))
           if [ $a -eq $sum ]
               then
               elif [ $cishu -le 6 -a $cishu -gt 3 ]
               then 
                   echo "还行,您一共猜了${cishu}次,打败全球 66%的用户"
               else
                   echo "您一共猜了${cishu}次,可不中啊"
               fi  
               exit 0
           elif [ $a -gt $sum ]
           then 
               echo "太大了,再来一次吧"
               sleep 1
               duru
           elif [ $a -lt $sum ]
           then 
               echo "太小了,再来一次吧"
               sleep 1
               duru
           fi  
       }   
       function main(){
       duru
       while true
       do
           cai
       done
   }   
   main

考试题 8:计算从 1 加到 100 之和(要求用for 和while,至少给出两种方法)。

sum=0
for i in `seq 1 100`
done
echo $sum
echo "==================================="
j=0
for((i=0;i<=100;i++))
do
    ((j=j+i))
done
echo $j
echo "=================================="
i=0
n=1
while [ $n -lt 101 ]
do
    i=$[$n+$i] 
    n=$[$n+1]
done
echo $i
echo "=================================="
i=0
n=100
until [ $n -le 0 ]
do
    i=$[$n+$i] 
    n=$[$n-1]
done
echo $i

考试题 9: 利用 bash for 循环打印下面这句话中字母数不大于 6 的单词(某企业面试真题)。I am oldboy teacher welcome to oldboy training class

a=(I am oldboy teacher welcome to oldboy training class)                                                                              
for n in ${a[*]}
do
    if [ ${#n} -le 6 ]
    then
        echo "${n}"
    fi
done

考试题 10:使用 read 读入方式比较两个整数大小,要求对用户输入的内容严格判断是否为整数,是否输入了两个数字。

read -p "pls input two number:" nmb1 nmb2
expr $nmb1 + 1 &>/dev/null
retval1=$?
expr $nmb2 + 1 &>/dev/null
retval2=$?
if [ -z "$nmb1" -o -z "$nmb2" -o $retval1 -ne 0 -o $retval2 -ne 0 ]
then
    echo "error must input two number"
    exit 1
fi
if [ $nmb1 -gt $nmb2 ]
then
    echo "$nmb1>$nmb2"
elif [ $nmb1 -lt $nmb2 ]
then
    echo "$nmb1<$nmb2"
else
    echo "$nmb1=$nmb2"
fi

考试题 11:批量生成随机字符文件名案例
使用for 循环在/oldboy 目录下批量创建 10 个 html 文件,其中每个文件需要包含 oldboy 固定字符串加 10 个随机小写字母,名称示例如下:
[root@oldboy scripts]# ls /oldboy
oldboy_amaeeurmja.html oldboy_jmtiqwhinw.html oldboy_rnbwmjkjkh.html oldboy_yhufdiceox.html oldboy_antodvkjcf.html oldboy_ncivkckvok.html oldboy_tyqfhfxvup.html
oldboy_epwmszmttm.html oldboy_osjmrurgsx.html oldboy_vpgslhajdn.html

Path=/oldboy
[ -d $Path ] || mkdir $Path
for n in {1..10}                                                                                                                      
do
    rand=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 1-10`
    touch $Path/oldboy_${rand}.html
done

考试题 12:批量改名特殊案例
将上题 11 中结果文件名中的oldboy 字符串全部改成oldgirl,并且将扩展名html 全部改成大写 HTML(不低于 2 种方法)。

`rename oldboy oldgirl *.html && rename .html .HTML *.html`
echo "================================================"                                                                               
ls *.html |awk -F "[._]" '{print "mv",$0,"oldgirl_"$2".HTML" }'|bash

考试题 13:批量创建特殊要求用户案例
批量创建 10 个系统帐号oldboy01-oldboy10 并设置密码(密码为随机 8 位数)。
不用for 循环的实现思路:http://user.qzone.qq.com/49000448/blog/1422183723

for user in {01..10}
do
    pass=`echo "$RANDOM"|md5sum|cut -c 1-8`
    useradd oldboy$user &>/dev/null
    echo "$pass"|passwd --stdin oldboy$user &>/dev/null
    echo "oldboy$user $pass" >>/tmp/pass.log
done

考试题 14:解决DOS 攻击生产案例
写一个 Shell 脚本解决DOS 攻击生产案例。
请根据 web 日志,监控当某个 IP 短时内 PV 达到 100(读者根据实际情况设定),即调用防火墙命令封掉对应的 IP。防火墙命令为:iptables -I INPUT -s IP -j DROP(IP 为要封的地址)。

file=$1
awk '{print $1}' $1|grep -v "^$"|sort|uniq -c >/tmp/tmp.log
exec >/tmp/droplits_$(date +%F).log
    fi
done

考试题 15:菜单自动化软件部署经典案例
综合实例:打印选择菜单,按照选择一键安装不同的Web 服务。示例菜单:
[root@oldboy scripts]# sh menu.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
pls input the num you want:
要求:
1、当用户输入 1 时,输出“start installing lamp.提示”然后执行/server/scripts/lamp.sh, 脚本内容输出"lamp is installed"后退出脚本,工作中就是正式 lamp 一键安装脚本;
2、当用户输入 2 时,输出“start installing lnmp.提示” 然后执行/server/scripts/lnmp.sh 输出"lnmp is installed"后退出脚本,工作中就是正式 lnmp 一键安装脚本;
3、当输入 3 时,退出当前菜单及脚本;
4、当输入任何其它字符,给出提示“Input error”后退出脚本;
5、要对执行的脚本进行相关的条件判断,例如:脚本文件是否存在,是否可执行等判断, 尽量用上前面讲解的知识点。

shu(){
    cat </dev/null
    if [ $? -ne 0 ]
    then
        echo 请输入数字 1、2、3
        shu
    elif [ ${#sum} -lt 1 ]
    then
        echo 您未输入数字
        shu
    elif [ $sum -eq 1 ]
    then
        lamp
    elif [ $sum -eq 2 ]
    then
        lnmp
    elif [ $sum -eq 3 ]
    then
        tui
    fi
}
lamp(){
    if [ -x /server/scripts/lamp.sh ] && [ -f /server/scripts/lamp.sh ]
    then
        . /server/scripts/lamp.sh
        echo "start install lamp"
        shu
    else
        echo "您的脚本有异常"
        shu
    fi
}
lnmp(){
    if [ -x /server/scripts/lnmp.sh ] && [ -f /server/scripts/lnmp.sh ]
    then
        . /server/scripts/lnmp.sh
        echo "start install lnmp"
        shu
    else
        echo "您的脚本有异常"
        shu
    fi
}
tui(){
    exit 0
}
main(){
    while true
    do
        shu
        lamp
        lnmp
        tui
    done
}
main

考试题 16:批量检查多个网站地址是否正常
企业面试题:批量检查多个网站地址是否正常要求:
1、使用shell 数组方法实现,检测策略尽量模拟用户访问。
2、每 10 秒钟做一次所有的检测,无法访问的输出报警。
3、待检测的地址如下http://blog.oldboyedu.com http://www.baidu.com http://oldboy.blog.51cto.com http://10.0.0.7

. /etc/init.d/functions
url_list=(
http://blog.oldboyedu.com
http://www.baidu.com
http://oldboy.blog.51cto.com
http://10.0.0.7
)
url_ar(){
    for ((i=0;i<${#url_list[*]};i++))
    do
        wget -q -o /dev/null -T 10 --tries=1 --spider ${url_list[i]}
        if [ $? -eq 0 ]
        then
            action "${url_list[i]}" /bin/true
        else
            action "${url_list[i]}" /bin/false
        fi 
    done
}
main(){
    while true
    do
        url_ar
        sleep 10
    done
}
main

考试题 17-18:单词及字母去重排序案例
用 shell 处理以下内容
1、按单词出现频率降序排序(不低于 3 种方法)
2、按字母出现频率降序排序(不低于 3 种方法)
the squid project provides a number of resources to assist users design,implement and support squid installations. Please browse the documentation and support sections for more infomation,by oldboy training.

17题 
  tr ",. " "\n" <17.txt |sort |uniq -c|sort -nr |head -5
tr ",. " "\n" <17.txt |awk '{S[$1]++}END{for(k in S) print S[k],k}'|sort -
nr|head -5
awk -F"[,. ]+" '{for(i=1;i<=NF;i++) S[$i]++}END{for(k in S) print S[k],k}' 
17.txt|sort -nr |head -5
sed 's# #\n#g;s#,#\n#g' 17.txt |sort |uniq -c|sort -nr |head -5
sed 's# #\n#g;s#,#\n#g' 17.txt |awk '{S[$1]++}END{for(k in S) print 
S[k],k}'|sort -nr|head -5
egrep -o "[a-Z]+" 17.txt |sort |uniq -c|sort -nr |head -5
egrep -o "[a-Z]+" 17.txt |awk '{S[$1]++}END{for(k in S) print S[k],k}'|sort -
nr|head -5
awk -vRS="[^a-zA-Z]" '{S[$1]++}END{for(k in S) print S[k],k}' 17.txt|sort -
nr|head -5

18题
arr=(the squid project provides a number of resources to assist usersdesign,implement and 
support squ
id installations. Please browse the documentation and support sections for more infomation,by 
oldboy 
training)
echo ===============NO.1================
for i in ${arr[*]}
do
    echo $i|sed 's#[^a-Z]##g'|grep -o '[^ ]' >>/tmp/1.txt
    [root@web01 scripts]# sed 's# #\n#g;s#,#\n#g' 17.txt |sort |uniq -c|sort -nr |head -5
done
sort /tmp/1.txt|uniq -c|sort -nr
echo ===============NO.2================
tr ",. " "\n" <17.txt|grep -o '[^ ]'|sort|uniq -c|sort -nr 
echo ===============NO.3================
tr "., " "\n" <17.txt|awk -F "" '{for(i=1;i<=NF;i++)S[$i]++}END{for(k in S)print S[k],k|"sort -nr"}'

考试题 19:已知:/etc/hosts 的内容为
192.168.1.11 oldboy11
192.168.1.21 oldboy21
192.168.1.31 oldboy31
请用shell 脚本实现,怎么才能在输入 IP 后找到/etc/hosts 里对应的唯一的 hostname?

解答:
if [ $# -ne 1 ]
then
    echo "Usage: $0 + IP"
    exit 1
else
    hostname=`awk -F "[ ]+" -vn=$1 '$1==n{print $2}' /etc/hosts`
    if [ ${#hostname} -eq 0 ]
    then
        echo "not found $1 in /etc/hosts"
    else
        echo $hostname
    fi
fi

考试题 20:老男孩交流群某人发问如下
上海@Danny(122504707)21:54:37
请教一个问题
cat oldboy.txt
192.168.1.1 /hello1/b.do?bb=4
192.168.1.2 /hello2/a.do?ha=3
192.168.1.3 /hello3/r.do?ha=4
如何显示成以下效果
192.168.1.1 b.do
192.168.1.2 a.do
192.168.1.3 r.do

array=(
"192.168.1.1 /hello1/b.do?bb=4"
"192.168.1.2 /hello2/a.do?ha=3"
"192.168.1.3 /hello3/r.do?ha=4"
)
for n in "${array[@]}"
do
    echo $n|awk -F "[ /?]" '{print $1,$4}'
done
echo "========================================="
while read line
do
    echo $line|awk -F "[ /?]" '{print $1,$4}'
done < 20.txt

你可能感兴趣的:(20道Shell编程阶段考试题及答案)