shell 练习-实现一个小型计算器

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
48
49
[root@nfs01 scripts]# cat bc.sh
#!/bin/sh
# First we should save the number which was inserted by user
read -p "Please insert the first number and the method you want to caculate:" num1
read -p "Please insert the second number and the method you want to caculate:" num2
read -p "Please insert the method you want to caculate:" \opt
usage(){
echo "Usage $0 num1 num2 operation"
exit 1
}
if_int(){
num=$1
if [ ! -z $(echo $num | sed 's/[0-9]//g') ];then
usage
exit 2
fi
}
if_int $num1
if_int $num2
caculate(){
echo "${num1}${opt}${num2}=$((${num1}${opt}${num2}))"
}
if_zero(){
if [ $1 -eq 0 ];then
echo "The dividend can't be zero,please input a number which is not equal 0"
exit 3
fi
}
case $opt in
"+")
caculate $num1 $num2 $opt
;;
"-")
caculate $num1 $num2 $opt
;;
"*")
caculate $num1 $num2 $opt
;;
"/")
if_zero $num2
result=$(echo ${num1}${opt}${num2} | bc )
echo $result
;;
"%")
caculate $num1 $num2 $opt
;;
esac

        这个试题遇到的问题就是尽量不要进行变量的复用,变量的多次复用会导致意外的问题。比如从用户那里接受到了 $opt=* ,然后当把变量再赋值给另外的变量的时候那就不是 了,这个 会被解析成为当前目录下的所有文件,就会出问题,除非要求用户输入的时候指定 \* 这种格式,给 * 脱意。

shell 练习-解决某个分区快满的问题

有一天,你发现你所管理的服务器磁盘某个分区马上要满了,那你如何做呢?

提示:

  1. 查看和统计各个分区使用情况,把占用空间大的目录以及文件找出来,看看是不是有一些老的没有用的文件占用了空间,比如有日志,那你可以考虑写一个任务计划每天定点删除一个月之前的;

  2. 如果不能删除,那么就要想办法添加磁盘,假如你已经成功添加磁盘,请问,你如何分区,然后 如何解决某个分区快满的问题?

阅读全文 >>

shell 练习-封ip

需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!

分析: 我们要做的,不仅是要找到哪些ip请求量不合法,并且还要每隔一段时间把之前封掉的ip(若不再继续请求了)给解封。 所以该脚本的关键点在于定一个合适的时间段和阈值。

比如, 我们可以每一分钟去查看一下日志,把上一分钟的日志给过滤出来分析,并且只要请求的ip数量超过100次那么就直接封掉。 而解封的时间又规定为每半小时分析一次,把几乎没有请求量的ip给解封!

阅读全文 >>

shell 练习-监控httpd进程

在服务器上,写一个监控脚本。

  1. 每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功?

  2. 若没有正常启动还需再一次启动,最大不成功数超过5次则需要理解发邮件通知管理员,并且以后不需要再检测!

  3. 如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件给管理员,然后自动退出该脚本。假设其中发邮件脚本为之前咱们使用的mail.py

阅读全文 >>