老男孩 Linux 云计算 Shell 高级编程实战综合考试题
考试题 1:
用 source 执行脚本和用 bash 执行 Shell 脚本的区别是什么?
通过source和“.”加载执行过的脚本,实在当前Shell中执行脚本,因此在脚本结束后,脚本中的变量值在当前Shell中依然存在;
而sh和bash执行脚本都会启动新的子Shell执行,执行完后返回父Shell。因此变量等无法保留。
考试题2:
定义变量内容,不加引号、单引号、双引号、反引号有什么区别?
单引号:所见即所得,将引号内的所有内容都原样输出
双引号:输出双引号内的所有内容,如果有命令、变量、特殊转义符等,先解析,然后输出解析结果
无引号:赋值时如果有空格会造成赋值不完整。在输出内容时,会将含有空格的字符串视为 一个整体来输出,如果有变量、命令等,会先把变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,有可能无法完整输出
反引号:一般用于引用命令,执行的时候命令会被执行
考试题3:
写出特殊变量对应的意义及应用
ID | 变量 | 意义 |
---|---|---|
1 | $0 | 获取当前执行的Shell脚本的文件名 |
2 | $n | 获取当前执行的Shell脚本的第n个参数 |
3 | $# | 获取当前执行的Shell脚本后面接的参数的总个数 |
4 | $* | 获取当前Shell脚本所有传参的参数;加引号将所有参数视为单个字符串 |
5 | $@ | 获取当前She了脚本所有传参的参数;加引号将所有参数视为不同的独立字符串 |
6 | $? | 获取执行上一条指令的执行状态返回值,0为成功,非0为失败 |
7 | $$ | 获取当前执行的Shell脚本的进程号(PID) |
8 | $! | 获取上一个在后台工作的进程的进程号 |
考试题 4:
写出下面特殊变量扩展的意义
ID | 表达式 | 意义 |
---|---|---|
1 | ${oldboy} | 返回变量$oldboy的内容 |
2 | ${# #oldboy} | 返回变量$oldboy内容的长度(按字符) |
3 | ${oldboy:offset:length} | 在变量${oldboy}中,从位置offset之后开始提取长度为length的子串 |
4 | ${oldboy#word} | 从变量${oldboy}开头开始删除最短匹配的word子串 |
5 | ${oldboy##word} | 从变量${oldboy}开头开始删除最长匹配的word子串 |
6 | ${oldboy%word} | 从变量${oldboy}结尾开始删除最短匹配的word子串 |
7 | ${oldboy%%word} | 从变量${oldboy}结尾开始删除最长匹配的word子串 |
8 | ${oldboy/pattern/string} | 使用string代替第一个匹配的pattern |
9 | ${oldboy//pattern/string} | 使用string代替所有匹配的pattern |
10 | ${oldboy:-word} | 如果oldboy变量值为空或未赋值,就会返回word字符串代替变量的值。用途:如果变量未定义,则返回备用的值,防止变量为空值或未定义而导致异常。 |
考试题5:
通过脚本传参的方式,检查 Web 网站 URL 是否正常(要求主体使用函数)。
[root@san/server/GJD]# cat 5.sh
#!/bin/bash
##############################################################
# File Name: 5.sh
# Created Time: 2019年06月12日 星期三 09时01分40秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
. /etc/init.d/functions
url(){
wget -q -o /dev/null --tries=1 -T 2 --spider $1
if [ $? -eq 0 ]
then
action "$1 is ok" /bin/true
else
action "$1 not ok" /bin/false
fi
}
usage(){
echo "usage: $0 URL"
}
main(){
if [ $# -ne 1 ]
then
usage
else
url $1
fi
}
main $*
结果测试:
[root@san/server/GJD]# sh 5.sh www.baidu.com
www.baidu.com is ok [ 确定 ]
[root@san/server/GJD]# sh 5.sh www.qq.com
www.qq.com not ok [失败]
考试题6:
开发 Nginx 服务(编译安装)启动停止脚本,并分别通过 chkconfig(CentOS6)
和 systemctl(CentOS7)实现开机自启动。
[root@web01/server/Shell]# cat 6.sh
#!/bin/bash
##############################################################
# Time:2019-06-02 15:36:12
# File Name: 6.sh
# Version: V1.0
# Author: 高建栋
# Organization: www.baidu.com
##############################################################
path=/application/nginx/sbin
RETVAL=0
. /etc/init.d/functions
function start() {
if [ `netstat -lntup|grep nginx|wc -l` -eq 0 ]
then
$path/nginx
RETVAL=$?
if [ $RETVAL -eq 0 ]
then
action "nginx is started" /bin/true
return $RETVAL
else
action "nginx is started" bin/false
return $RETVAL
fi
else
echo "nginx is runing"
return 0
fi
}
function stop() {
if [ `netstat -lntup|grep nginx|wc -l` -ne 0 ]
then
$path/nginx -s stop
RETVAL=$?
if [ $RETVAL -eq 0 ]
then
action "nginx is stoped" /bin/true
return $RETVAL
else
action "nginx is stop" bin/false
return $RETVAL
fi
else
echo "nginx is not runing"
return 0
fi
}
case "$1" in
start)
start
RETVAL=$?
;;
stop)
stop
RETVAL=$?
;;
restart)
stop
sleep 2
start
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
结果测试:
[root@web01/server/Shell]# sh 9-8-nginx1.sh start
nginx is started [ 确定 ]
[root@web01/server/Shell]# sh 9-8-nginx1.sh stop
nginx is stoped [ 确定 ]
[root@web01/server/Shell]# sh 9-8-nginx1.sh restart
nginx is stoped [ 确定 ]
nginx is started [ 确定 ]
考试题7:
猜数字游戏。首先让系统随机生成一个数字,给这个数字定一个范围(1-60),
让用户输入猜的数字,对输入进行判断,如果不符合要求,就给予高或低的提示,猜对后则
给出猜对用的次数。
[root@san/server/scripts]# cat 7.sh
#!/bin/bash
##############################################################
# File Name: 7.sh
# Created Time: 2019年06月11日 星期二 11时43分57秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
a=$((RANDOM%100))
echo "===猜数字==="
c=0
menu(){
read -p "pls input num:" b
expr $b + 1 &>/dev/null
if [ $? -ne 0 ]
then
echo "请输入整数数字。"
menu
fi
}
meng(){
((c++))
if [ $b -eq $a ]
then
echo "恭喜你,蒙了$c次,终于对了。"
exit 0
elif [ $b -gt $a ]
then
echo "大了"
menu
else
echo "小了"
menu
fi
}
main(){
menu
while true
do
meng
done
}
main
结果测试:
[root@san/server/scripts]# sh 7.sh
===猜数字===
pls input num:56
大了
pls input num:34
小了
pls input num:44
小了
pls input num:50
恭喜你,蒙了4次,终于对了。
考试题8:
计算从 1 加到 100 之和(要求用 for 和 while,至少给出两种方法)。
[root@san/server/scripts]# cat 8.sh
#!/bin/bash
##############################################################
# File Name: 8.sh
# Created Time: 2019年06月11日 星期二 11时42分50秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
a=0
i=1
while [ $i -le 100 ]
do
((a=a+i))
((i++))
done
echo $a
[root@san/server/scripts]# sh 8.sh
5050
考试题9:
利用 bash for 循环打印下面这句话中字母数不大于 6 的单词(某企业面试真
题)。
I am oldboy teacher welcome to oldboy training class
[root@san/server/scripts]# cat 9.sh
#!/bin/bash
##############################################################
# File Name: 9.sh
# Created Time: 2019年06月11日 星期二 11时23分39秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
for n in I am oldboy teacher welcome to oldboy training class
do
if [ `echo $n|wc -L` -le 6 ]
then
echo $n
fi
done
结果测试:
[root@san/server/scripts]# sh 9.sh
I
am
oldboy
to
oldboy
class
考试题10:
使用 read 读入方式比较两个整数大小,要求对用户输入的内容严格判断是否
为整数,是否输入了两个数字。
[root@san/server/scripts]# cat 10.sh
#!/bin/bash
##############################################################
# File Name: 10.sh
# Created Time: 2019年06月11日 星期二 11时05分14秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
read -p "pls input two num:" a b
expr $a + $b + 1 &>/dev/null
if [ $? -ne 0 ]
then
echo "请输入两个整数数字。"
fi
if [ $a -eq $b ]
then
echo "$a=$b"
elif [ $a -ge $b ]
then
echo "$a>$b"
else
echo "$a<$b"
fi
结果测试:
[root@san/server/scripts]# sh 10
sh: 10: 没有那个文件或目录
[root@san/server/scripts]# sh 10.sh
pls input two num:2 3
2<3
[root@san/server/scripts]# sh 10.sh
pls input two num:3 2
3>2
[root@san/server/scripts]#
[root@san/server/scripts]# sh 10.sh
pls input two num:2 2
2=2
考试题11:
使用 for 循环在/oldboy 目录下批量创建 10 个 html 文件,其中每个文件需要包含 oldboy
固定字符串加 10 个随机小写字母.
[root@san/server/scripts]# cat 11.sh
#!/bin/bash
##############################################################
# File Name: 11.sh
# Created Time: 2019年06月11日 星期二 09时25分37秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
. /etc/init.d/functions
path=//server/scripts/oldboy
[ -d $path ] || mkdir -p $path
for n in `seq 10`
do
a=$(openssl rand -base64 30|sed "s#[^a-z]##g"|cut -c 1-10)
touch $path/oldboy_${a}.html
if [ $? -eq 0 ]
then
action "touch ok" /bin/true
else
action "touch not ok" /bin/false
fi
done
结果测试:
[root@san/server/scripts]# sh 11.sh
touch ok [ 确定 ]
touch ok [ 确定 ]
touch ok [ 确定 ]
touch ok [ 确定 ]
touch ok [ 确定 ]
touch ok [ 确定 ]
touch ok [ 确定 ]
touch ok [ 确定 ]
touch ok [ 确定 ]
touch ok [ 确定 ]
[root@san/server/scripts]# ls oldboy
oldboy_cbjdaijmro.html oldboy_egtrjzibzk.html oldboy_nahgmmlyxt.html oldboy_znqquzqeuh.html
oldboy_cldmesxdmm.html oldboy_igidrkgsil.html oldboy_ougnshjyxh.html
oldboy_cwxzubbntt.html oldboy_kmwkzrztpb.html oldboy_ymvyzaoycu.html
考试题12:
将上题 11 中结果文件名中的 oldboy 字符串全部改成 oldgirl,并且将扩展名 html 全部改成
大写 HTML(不低于 2 种方法)。
方法一:
[root@san/server/scripts]# cat 12.sh
#!/bin/bash
##############################################################
# File Name: 12.sh
# Created Time: 2019年06月11日 星期二 10时24分51秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
path=/server/scripts/oldboy
cd $path
ls|awk -F "[_.]" '{print "mv "$0" oldgirl_"$2".HTML" }'|bash
结果测试:
[root@san/server/scripts]# sh 12.sh
[root@san/server/scripts]# ll oldboy
总用量 0
-rw-r--r-- 1 root root 0 6月 11 10:23 oldgirl_cbjdaijmro.HTML
-rw-r--r-- 1 root root 0 6月 11 10:23 oldgirl_cldmesxdmm.HTML
-rw-r--r-- 1 root root 0 6月 11 10:23 oldgirl_cwxzubbntt.HTML
-rw-r--r-- 1 root root 0 6月 11 10:23 oldgirl_egtrjzibzk.HTML
-rw-r--r-- 1 root root 0 6月 11 10:23 oldgirl_igidrkgsil.HTML
-rw-r--r-- 1 root root 0 6月 11 10:23 oldgirl_kmwkzrztpb.HTML
-rw-r--r-- 1 root root 0 6月 11 10:23 oldgirl_nahgmmlyxt.HTML
-rw-r--r-- 1 root root 0 6月 11 10:23 oldgirl_ougnshjyxh.HTML
-rw-r--r-- 1 root root 0 6月 11 10:23 oldgirl_ymvyzaoycu.HTML
-rw-r--r-- 1 root root 0 6月 11 10:23 oldgirl_znqquzqeuh.HTML
方法二:
[root@san/server/scripts]# cat 12_2.sh
#!/bin/bash
##############################################################
# File Name: 12_2.sh
# Created Time: 2019年06月11日 星期二 10时38分41秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
path=/server/scripts/oldboy
cd /$path
a="oldgirl_"
for n in `ls`
do
b=$(echo $n|awk -F '[_.]' '{print $2}')
mv $n ${a}${b}.HTML
done
方法三:
[root@san/server/scripts]# cat 12_3.sh
#!/bin/bash
##############################################################
# File Name: 12-3.sh
# Created Time: 2019年06月11日 星期二 11时01分19秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
path=/server/scripts/oldboy
cd /$path
rename oldboy oldgirl *.html
rename html HTML *.html
考试题13:
批量创建要求用户案例
批量创建 10 个系统帐号 oldboy01-oldboy10 并设置密码(密码为随机 8 位数)。
[root@san/server/scripts]# cat user.sh
#!/bin/bash
##############################################################
# File Name: user.sh
# Created Time: 2019年06月11日 星期二 09时16分55秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
. /etc/init.d/functions
u=oldboy
file=/tmp/user.log
for n in `seq 10`
do
useradd $u$n &>/devlnull
pass="`echo $RANDOM|md5sum|cut -c 2-12`"
echo "$pass"|passwd --stdin $u$n &>/dev/null
echo -e "user:$u$n\tpasswd:$pass" >>$file
if [ $? -eq 0 ]
then
action "$u$n ok" /bin/true
else
action "$u$n not ok" /bin/false
fi
done
echo --------
cat $file
结果测试:
[root@san/server/scripts]# sh user.sh
oldboy1 ok [ 确定 ]
oldboy2 ok [ 确定 ]
oldboy3 ok [ 确定 ]
oldboy4 ok [ 确定 ]
oldboy5 ok [ 确定 ]
oldboy6 ok [ 确定 ]
oldboy7 ok [ 确定 ]
oldboy8 ok [ 确定 ]
oldboy9 ok [ 确定 ]
oldboy10 ok [ 确定 ]
--------
user:oldboy1 passwd:489ca084787
user:oldboy2 passwd:6863ad8bcd7
user:oldboy3 passwd:e6c50fc889e
user:oldboy4 passwd:e931572b1fa
user:oldboy5 passwd:d13086f178c
user:oldboy6 passwd:be9140721c8
user:oldboy7 passwd:bd83ea814b7
user:oldboy8 passwd:1a6d96331d5
user:oldboy9 passwd:36691a6a32a
user:oldboy10 passwd:957c2741e6c
考试题14:
解决DOS攻击生产案例
写一个Shell 脚本解决 DOS 攻击生产案例。
请根据 web 日志,监控当某个 IP 短时内 PV 达到 100(读者根据实际情况设定),即调用
防火墙命令封掉对应的 IP。防火墙命令为:iptables -I INPUT -s IP -j DROP(IP 为要封的
地址)
[root@san/server/GJD]# cat 14.sh
#!/bin/bash
##############################################################
# File Name: 14.sh
# Created Time: 2019年06月12日 星期三 21时20分53秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
while true
do
awk -F"[: ]+" '/ESTABLISHED/{print $(NF-3)}' netstat.log |sort|uniq -c|sort -rn|head >/tmp/ip.log
while read line
do
ip=`echo $line|awk '{print $2}'`
count=`echo $line|awk '{print $1}'`
if [ $count -gt 3 ] && [ `iptables -nL|wc -l` -lt 1 ]
then
echo "$ip is 危险"
iptables -I INPUT -s $ip -j DROP
else
echo "$ip is 安全"
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、要对执行的脚本进行相关的条件判断,例如:脚本文件是否存在,是否可执行等判断,
尽量用上前面讲解的知识点。
[root@san/server/scripts]# cat 15.sh
#!/bin/bash
##############################################################
# File Name: 15.sh
# Created Time: 2019年06月10日 星期一 20时39分33秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
path=/server/scripts
cat</dev/null
if [ $? -ne 0 ]
then
echo $"usage: {1|2|3}"
exit 1
fi
if [ $a -eq 1 ]
then
echo "start installing lamp."
"$path/lamp.sh"
exit 0
elif [ $a -eq 2 ]
then
echo "start installing lnmp."
"$path/lnmp.sh"
exit 0
elif [ $a -eq 3 ]
then
exit 0
else
echo "Input error."
fi
结果测试:
[root@san/server/scripts]# sh 15.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
请选择服务:2
start installing lnmp.
lnmp is installed
[root@san/server/scripts]# sh 15.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
请选择服务:1
start installing lamp.
lamp is installed.
[root@san/server/scripts]# sh 15.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
请选择服务:3
考试题16:
批量检查多个网站地址是否正常
企业面试题:批量检查多个网站地址是否正常
要求:
1、使用 shell 数组方法实现,检测策略尽量模拟用户访问。
2、每 10 秒钟做一次所有的检测,无法访问的输出报警。
3、待检测的地址如下
http://blog.oldboyedu.com
http://www.baidu.com
http://oldboy.blog.51cto.com
http://10.0.0.7
[root@san/server/scripts]# cat 16.sh
#!/bin/bash
##############################################################
# File Name: 16.sh
# Created Time: 2019年06月10日 星期一 21时22分02秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
. /etc/init.d/functions
count=0
list=(
http://blog.oldboyedu.com
http://www.baidu.com
http://oldboy.blog.51cto.com
http://10.0.0.7
)
url(){
for ((i=0;i<`echo ${#list[*]}`;i++))
do
wget -o /dev/null -T 3 --tries=1 --spider ${list[$i]} >/dev/null 2>&1
if [ $? -eq 0 ]
then
action "${list[$i]} is ok" /bin/true
else
action "${list[$i]} is not ok" /bin/false
fi
done
((count++))
}
main(){
while true
do
url
echo ----${count}----
sleep 2
done
}
main
结果测试:
[root@san/server/scripts]# sh 16.sh
http://blog.oldboyedu.com is not ok [失败]
http://www.baidu.com is ok [ 确定 ]
http://oldboy.blog.51cto.com is ok [ 确定 ]
http://10.0.0.7 is not ok [失败]
----1----
http://blog.oldboyedu.com is ok [ 确定 ]
http://www.baidu.com is ok [ 确定 ]
http://oldboy.blog.51cto.com is ok [ 确定 ]
http://10.0.0.7 is not ok [失败]
考试题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 document ation and support sections for more infomation,by oldboy training.
17:
方法一:
[root@san/server/scripts]# tr "[,. ]" "\n"
18:
grep -o "[^ ]" oldboy.txt|sort|uniq -c|sort -rn
考试题 19:
已知:/etc/hosts 的内容为
192.168.1.11 oldboy11
192.168.1.21 oldboy21
192.168.1.31 oldboy31
请用 shell 脚本实现,怎么才能在输入 IP 后找到/etc/hosts 里对应的唯一的 hostname?
解答:
[root@san/server/scripts]# cat 19.sh
#!/bin/bash
##############################################################
# File Name: 19.sh
# Created Time: 2019年06月10日 星期一 19时53分03秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
read -p "pls input IP后两位:" IP
grep "192.168.1.$IP" /etc/hosts|awk -F '[ ]' '{print $NF}'
结果测试:
[root@san/server/scripts]# sh 19.sh
pls input IP后两位:21
oldboy21
[root@san/server/scripts]# sh 19.sh
pls input IP后两位:31
oldboy31
[root@san/server/scripts]# sh 19.sh
pls input IP后两位:11
oldboy11
考试题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
解答:
[root@san/server/scripts]# cat 20.sh
#!/bin/bash
##############################################################
# File Name: 20.sh
# Created Time: 2019年06月10日 星期一 20时03分49秒
# Version: V1.0
# Organization: 58期6组
# Author: oldtall
##############################################################
awk -F '[/ ?]' '{print $1,$4}' oldboy.txt
结果测试:
[root@san/server/scripts]# sh 20.sh
192.168.1.1 b.do
192.168.1.2 a.do
192.168.1.3 r.do