shell练习题

  1. 函数内如何设置局部变量(A)
A:local
B:export
C:source
D:function
  1. 以下哪一种指令显示的结果为$test©
A:\echo $test	
B:echo “$test”		
C:echo ‘$test’		
D:echo “${test}”
  1. 一个bash shell脚本的第1行是什么(A)
A:#!/bin/bash
B:#/bin/bash
C:#/bin/csh
D:/bin/bash
  1. 以下参数,如何在执中查看执行过程(A)
A:-x
B:-X
C:-s	
D:-S
第2章 简答
  1. 如何显示默认的环境变量
env
set
  1. 如何设置环境变量与局部变量
环境变量加export
局部变量不加export
第3章 编程
  1. 按照时间生成文件2018-05-22.log将每天的磁盘使用状态写入到对应日期的文件
[root@shell word]# cat date.sh 
#!/bin/bash
Date=`date +%F`
df -h|awk "NR==1||NR==6||NR==7" > ${Date}.log
  1. 统计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`
[root@shell word]# cat nginx.sh 
#!/bin/sh
awk '{print $1}' /var/log/nginx/access.log|sort|uniq -c|sort -rn
  1. 写一个脚本计算一下Linux系统所有进程占用内存大小的和
[root@shell word]# cat mem.sh 
#!/bin/sh
total=`ps aux|awk '{print $4}'|grep -v  %MEM|awk '{sum=sum+$1}END{print sum}'`
echo "所有进程占用内存大小: " $total
  1. 在/backup下创建10个.txt的文件,找到/backup目录下所有后缀名为.txt的文件
	1.批量修改txt为txt.bak
	echo *.txt|xargs -n1|awk -F. '{print"mv " $1".txt " $1".txt.bak"}'|bash
	echo *.txt|xargs -n1|sed  -r 's/(.*).txt$/mv \1.txt \1.txt.bak/g'|bash
	[root@shell word]# cat mv.sh 
    #!/bin/sh
    for i in `seq 10`
    do 
    mv /backup/${i}.txt /backup/${i}.txt.bak
    
    done
	2.把所有的.bak文件打包压缩为123.tar.gz
	tar -zcvf 123.tar.gz ./*.bak
	3.批量还原文件的名字,及把增加的.bak再删除
	echo *.bak|xargs -n1|awk -F. '{print"mv " $1".txt.bak " $1".txt"}'|bash
  1. 写出以下位置参数的作用
$0  : 脚本名称
$n  : 脚本的第N个参数
$#  : 获取脚本的总参数
$*  : 获取脚本的所有参数
$@  : 获取脚本的所有参数
  1. 写出以下特殊变量的作用
$?  : 上条命令执行的结果
$$  : 获取脚本的PID
$!  : 获取上个脚本执行的PID
$_  : 获取脚本的最后一个参数
  1. 写出以下字母比较的作用
-eq : 等于
-ne : 不能等于
-gt : 大于
-ge : 大于等于
-lt : 小于
-le : 小于等于
  1. 写出下面特殊变量扩展的意义
${oldboy}   : 变量
${#oldboy}	: 变量长度的统计
${url#*.}   : 从前往后删
${url##*.}  : 从前往后删,贪婪匹配
${url%.*}   : 从后往前删
${url%%.*}  : 从后往前删,贪婪匹配
第2章 简答
  1. 写出3个以上可用于计算的命令
1. expr 1 + 1
2. echo $[1+1]
3. echo 10 20|awk '{print $1*$2}'
4. awk 'BEGIN{print 1+1}'
第3章 编程
  1. 输入两个整数计算这两个整数的相加,相减,相乘,相除,求余的结果
while true
do
read -p "请输入两个整数: " num1 num2
echo "${num1}+${num2} = `awk "BEGIN{print ${num1}+${num2}}"` "
echo "${num1}-${num2} = `awk "BEGIN{print ${num1}-${num2}}"` "
echo "${num1}*${num2} = `awk "BEGIN{print ${num1}*${num2}}"` "
echo "${num1}/${num2} = `awk "BEGIN{print ${num1}/${num2}}"` "
echo "${num1}%${num2} = `awk "BEGIN{print ${num1}%${num2}}"` " 
done
  1. 把一个文本文档的前五行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉
awk 'NR<=5' /server/scripts/word/1.txt|sed -i "/[a-z]/d"
sed  -in '6,10s/[a-z]//gp' 1.txt
  1. 打印下面这句话中字母数小于5的单词 I am lizhenya teacher I am 18
[root@shell word]# cat name.sh 
for i in I am lizhenya teacher I am 18
do
    if [ ${#i} -gt 5 ];then
     echo "${i}"
    fi
done
[root@shell word]# sh name.sh 
lizhenya
teacher
  1. 写个shell,看看你的linux系统中是否有自定义用户(普通用户),若是有,一共有几个?
[root@shell word]# cat user.sh 
#!/bin/sh
user=`awk -F[:/] '{print $7}' /etc/passwd`
a=0
for i in $user
do
[ "$i" = "home" ] && let a++
done
    echo "普通用户为: $a"
[root@shell word]# sh user.sh 
普通用户为: 6
  1. 写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10
history|awk '{print $2}'|sort|uniq -c|sort -rn|head
  1. 编写一个脚本,计算100以内所有能被3整除数字的和
[root@shell word]# cat ran1.sh 
#!/bin/sh
sum=0
for i in `seq 100`
do
	if [ $((${i}%3)) -eq 0 ];then
	let sum+=$i
	fi
done
echo $sum
[root@shell word]# sh ran1.sh 
1683
判断
  1. 填写以下字符串测试操作符的意义
-n :字符串长度不为0,则为真
-z : 字符串长度为0,则为真
  1. 写出下面条件测试的含义
[ -e dir|file ]     : 	文件存在则为真	
[ -d dir ]          :   目录存在则为真
[ -f file ]         :   普通文件存在则为真
[ -r file ] 		:   文件存在可读 则为真
[ -x file ]			:   文件存在可执行 则为真
[ -w file ]         :   文件存在可写 则为证
  1. 定义变量内容,不加引号、单引号、双引号、反引号结果有什么不同?应该怎么用?
不叫引号    :   可以解析变量
单引号      :   不可以解析变量
双引号      :   可以解析变量
反引号      :   执行命令
  1. 将下面的条件表达式改写为if条件语句
[ -f /etc/hosts ] && echo !
[root@shell word]# cat 22.sh 
#!/bin/sh
ls /etc/hosts &>/dev/null
if [ $? -eq 0 ];then
	echo "存在"
else
	echo "不存在"
fi
  1. 写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些
[root@shell word]# cat network.sh 
#!/bin/sh
for i in {1..254}
do
	ping -c1 -W1 10.0.0.$i &>/dev/null
	if [ $? -eq 0 ];then
		echo "10.0.0.${i} : 在线"
	fi	
done
  1. 用shell处理以下内容
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
1. 按单词出现频率降序排序!
egrep '[a-Z]+' word.txt -o|sort|uniq -c|sort -rn
2. 按字母出现频率降序排序!
grep '[a-Z]' word.txt -o|sort|uniq -c|sort -rn|head
[root@shell word]# cat word.sh 
#!/bin/sh
egrep '[a-Z]+' word.txt -o|sort|uniq -c|sort -rn
grep '[a-Z]' word.txt -o|sort|uniq -c|sort -rn
  1. 使用ps aux查看系统进程发现有100多个test.sh脚本正在运行,如何杀死所有的test.sh
ps aux|grep test.sh|awk '{print $2}'|xargs kill -9
  1. 写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比语塞数字大或者小
[root@shell word]# cat number.sh 
#!/bin/sh
num=`echo $((RANDOM%100))`
echo $num
while true
do
	for i in $num
	do
	read -p "请输入你想要的数字: " num1
		if [ $num1 -eq $num ];then
			echo "恭喜你猜对了"
			exit		
		elif [ $num1 -gt $num ];then
		   echo "您输入的数字大了"
		elif [ $num1 -lt $num ];then
		   echo "您输入的数字小了"
		  break
		fi
	done
done
  1. 用Shell实现,把一个文本文档中只有一个数字的行给打印出来
[root@shell word]# cat ran3.sh 
#!/bin/sh
while read line
do
	num=`echo $line|sed 's/[^0-9]//g'|wc -L`
	if [ $num -eq 1 ];then
		echo $line
	fi

done<2.txt
  1. 写一个Shell脚本通过curl命令返回的状态码来判定所访问的网站是否正常,比如当前状态码200,才算正常
[root@shell word]# cat curl.sh 
#!/bin/sh
read -p "请输入域名: " num
for i in $num
do
	num1=`curl -Is ${num}|awk 'NR==1{print $2}'`
	if [ $num1 -eq 200 ];then
		echo "${i} 正常"
	else
		echo "${i} 不正常"
	fi

done
  1. 写出break continue exit return 的区别
break :
    退出循环,执行下一个循环.如果没有直接退出
continue :
    退出当前循环,返回上一次继续循环
exit    :
    退出循环
return  :
    当前函数返回,那就是退回到上一层调用处继续运行下面的代码,当然如果是在主函数main, 自然也就结束当前进程了。
return也可以用于void无返回值的函数中,就是结束这个函数运行,从调用处开始执行下一段代码。
return 表达式或值 ;一般用于带参数的函数,将表达式或值返回到调用处并退出这个函数的执行。从汇编语言的角度来说就是传送一个值到预定的寄存器或内存空间,并将CPU运行的相关寄存器内容出栈,返回调用处开始执行下一条指令
  1. 查看数组的索引与数组中元素的个数

  1. 生成0-100之间的随机数,并相加,直到大于1000,输出相加的结果
[root@shell word]# cat together.sh 
#!/bin/sh
num=0
while [ $num -le 1000 ]
do
	num1=$((RANDOM%101))
	num=$((num+$num1))
done
echo $num

  1. 生成0-100之间的随机数,并相加,直到大于1000,并判断最后一个随机数字能否被3整除
[root@shell word]# cat together1.sh 
#!/bin/sh
sum=0
num=0
while [ $sum -le 1000 ]
do
	num=$((RANDOM%101))
	sum=$((sum+num))
done 
if [[ $((${num}%3)) == 0 ]];then
	echo "最后一个随机数为: ${num}  ,可以被3整除"
else
	echo "最后一个随机数为: ${num}  ,不可以被3整除"
fi
  1. 判断/tmp目录下是否有大于4k的文件,如果有则输出该文件的大小与创建时间
[root@shell word]# cat find.sh 
#!/bin/sh
for i in `find /tmp/ -type f -size +4k`
do 
	if [ -e /tmp/ ];then
		echo ${i}|xargs ls -lh|awk '{print "文件为: "$NF" 大小为: "$5" 创建时间为: "$6" "$7" "$8}'
	fi
	
done

[root@shell word]# sh find.sh 
文件为: /tmp/acces.log 大小为: 8.4K 创建时间为: May 15 23:24
文件为: /tmp/acces.log.txt 大小为: 8.4K 创建时间为: May 15 23:32
  1. 数组array=(1 2 3 4 5 6)使用脚本打印出每个元素(每行显示一个元素)
[root@shell word]# cat array.sh 
#!/bin/sh
array=(1 2 3 4 5 6)
for i in ${!array[*]}
do
	echo ${array[$i]}
done
  1. 使用数组判断I am oldboy teacher welcome to training class中字母数大于6的单词
[root@shell word]# cat array2.sh 
#!/bin/sh
array=(I am oldboy teacher welcome to training class)
for i in ${!array[*]}
do
	if [ ${#array[$i]} -gt 5 ];then
	echo ${array[$i]}
	fi
done
  1. 检测服务器中重要的文件是否被修改吗如果被修改则报警
[root@shell word]# cat police.sh 
#!/bin/sh
md5_police=/root/police/police.md5
md5_file=`md5sum -c $md5_police|awk '{print $2}'`
md5failed=`md5sum -c $md5_police`
	if [ $md5_file = "OK" ];then
		echo "正常"
	else
	echo "${md5failed} 文件被修改"  > /root/police/md5.failed
	mailx -s "文件被修改" 973000142@qq.com < /root/police/md5.failed
	fi
[root@shell word]# sh police.sh 
正常

方法二:

[root@shell word]# cat police2.sh 
#!/bin/bash
md5_file="/services/scripts/practice/md5.txt"
result=`md5sum -c ${md5_file}`
echo "${result}"|awk -F"[: ]+" '$2 ~ /失败/{print}' > md5.failed
line=`cat md5.failed|wc -l`
if [[ ${line} -gt 0 ]]
 then
  echo "文件被修改!!!被修改文件有:"
  while read line
   do
    echo ${line}| awk -F"[: ]+" '{print $1}'
   done < md5.failed
 mailx -s "文件已被修改" 3413034530@qq.com < md5.failed
fi
  1. 计算nginx日志中访问最多的10个IP使用的流量总和

  1. 防止DOS攻击(检测nignx日志若某个IP短时间的PV过大则使用防火墙将其禁掉)
#!/bin/bash

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
interval=180
log_path="/var/log/nginx"
log_name_access="access.log"
log_name_error="error.log"
pid_path="/var/run/nginx.pid"
log_name_temp="nginx_temp.log"
recovery_name="nginx_recovery.log"
now=`date +%F`

function log_cut()
{
 [ -d ${log_path} ] &&  [ -f ${log_path}/${log_name_access} ] && \
 /usr/bin/mv -f ${log_path}/${log_name_access} ${log_path}/${log_name_temp} || return 1
 [ -f ${pid_path} ] && kill -USR1 `cat ${pid_path}` || return 1
}

function log_recovery()
{
 [ -d ${log_path} ] && [ -f ${log_path}/${log_name_temp} ] && cat ${log_path}/${log_name_temp} >> ${log_path}/${recovery_name} || return 1
 rm -rf ${log_path}/${log_name_temp}
}

function block_ip()
{
 [ -d ${log_path} ] && awk '{print $1}' ${log_path}/${log_name_temp}|sort|uniq -c|sort -rnk1 > ${log_path}/ip.log || return 1
 if [ -f ${log_path}/ip.log ]
 then
   while read line
   do
    local pv=`echo ${line}|awk '{print $1}'`
    local ip_add=`echo ${line}|awk '{print $2}'`
    if [ ${pv} -ge 300 -a `iptables -nL|grep "${ip_add}"|wc -l` -lt 1 ]
    then
      iptables -I INPUT -s ${ip_add} -j DROP
      echo ${ip_add} >> ${log_path}/`date +%F`_ip.log
    fi
   done < ${log_path}/ip.log
 fi
}

function del_block_ip()
{
 if [ -f ${log_path}/`date +%F -d "yesterday"`_ip.log ]
   then
   while read line
   do
    iptables -D INPUT -s ${line} -j DROP
   done < ${log_path}/`date +%F -d "yesterday"`_ip.log
 fi
}

while true
do
 log_cut
 if [ $? -ne 0 ]
 then
  echo "文件不存在"
  continue
 fi
 if [[ `date +%F` != ${now} ]]
 then
   del_block_ip
   now=`date +%F`
 fi
 block_ip
 if [ $? -ne 0 ]
 then
  echo "文件不存在"
  continue
 fi
 log_recovery
 sleep ${interval}
done


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值