考试题 1:用source 执行脚本和用bash 执行 Shell 脚本的区别是什么?
考试题 2:定义变量内容,不加引号、单引号、双引号、反引号有什么区别?
考试题 3:写出特殊变量对应的意义及应用
考试题 4:写出下面特殊变量扩展的意义
考试题 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