06-Shell 编程之练习题

1、写脚本规范及注意事项

  • 变量名称不能和系统已经存在的命令等重复free==>Free
  • 判断单位要统一
  • 脚本一行不超过一屏的一半。
  • 能写成变量的内容尽量写成变量

2、【练习题1】监控Memcached缓存服务是否正常

控Memcached缓存服务是否正常,模拟用户(web客户端)检测。

使用nc命令加上set/get来模拟检测。

脚本内容:

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
[lepeng@centos ~]# vim  memcache_check.sh 
#!/bin/bash
#
. /etc/init.d/functions
. /etc/init.d/run # 函数 jingdutiao 使用
MemPort=`netstat -lntp |grep -c 0.0.0.0:11211`
Set_Key='printf "set clsn2017 0 10 8\r\nclsn2018\r\n"|nc 10.0.0.180 11211'
Get_Key='printf "get clsn2017\r\n" |nc 10.0.0.180 11211 |grep -c clsn2018'
ReStart='systemctl restart memcached.service'

if [ $MemPort -eq 1 ]
then
$Set_Key
$Get_Key
if [ $? -ne 1 ]
then
action "Memcached 运行正常!" /bin/true
else
action "Memcached 服务异常!" /bin/false
fi
else
action "服务未启动!" /bin/false
$ReStart
jingdutiao
fi

脚本执行过程

3、【练习题2】使用(case)编写rsync管理脚本

写网络服务独立进程模式下Rsync的系统启动脚本,例如:/etc/init.d/rsyncd {start|stop|restart} 要求:

要使用系统函数库技巧。

在centos 6中服务可被chkconfig管理。

注意:服务的停止操作和启动操作之间要有间隔时间,使用sleep 1

1
2
3
pkill 进程
sleep 1
start 服务

rsync服务启动脚本

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[lepeng@centos ~]# cat rsyncd 
#!/bin/bash
#

. /etc/init.d/functions
. /etc/init.d/run

Rsync_Port=`netstat -lntup |grep -c 0.0.0.0:873`
Rsync_COM1='rsync --daemon'
Rsync_COM2='pkill rsync'

Rsync_Start() {
Rsync_Port1=`netstat -lntup |grep -c 0.0.0.0:873`
if [ $Rsync_Port1 -ne 0 ]
then
action "服务已启动" /bin/false
exit 3
else
$Rsync_COM1
#action "Rsync 启动" /bin/true
QiDong
fi
}

Rsync_Stop() {
Rsync_Port2=`netstat -lntup |grep -c 0.0.0.0:873`
if [ $Rsync_Port2 -eq 0 ]
then
action "服务未启动" /bin/false
exit 3
else
$Rsync_COM2
#action "Rsync 停止" /bin/true
TingZhi
fi
}

Rsync_Status() {
if [ $Rsync_Port -eq 1 ]
then
echo "Rsync 服务运行中..."
else
echo "Rsync 服务未运行"
fi
}

Rsync_Restart() {
Rsync_Stop
Rsync_Start
}
COMMAND=$1

case "$COMMAND" in
start)
Rsync_Start
;;
stop)
Rsync_Stop
;;
status)
Rsync_Status
;;
restart|reload|force-reload)
Rsync_Restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}"
exit 2
esac

脚本执行过程

4、获取取文件中的行,单词和字符

4.1、迭代获取文件中的每一行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 方法一
while read line;
do
echo $line;
done < file.txt


# 方法二
cat file.txt|while read line
do
echo $line
done


# 方法三
exec < file.txt
while read line;
do
echo line;
done

4.2、迭代获取每一个单词

1
2
3
4
for word in $line;
do
echo $word;
done

4.3、迭代获取每一个字符

1
2
3
4
5
word=participate
for ((i=0;i<${#word};i++))
do
echo ${word:1:1};
done

4.4、同时获取取文件中的行,单词和字符脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
n=1
while read i
do
echo "第${n}$i"
m=1
for x in $i
do
echo "第${m}个单词 $x"
echo $x|grep -o .
((m++))
done
((n++))
done < $1

4.5、eval 命令用法

eval 命令的说明

1
2
3
4
5
6
7
8
9
eval: eval [参数 ...]
将参数作为 shell 命令执行。

将 ARGs 合成一个字符串,用结果作为 shell 的输入,
并且执行得到的命令。

退出状态:
以命令的状态退出,或者在命令为空的情况下返回成功。
1.5 break continue exit return

示例:

1
2
3
4
5
6
[lepeng@centos ~]# clsn=6
[lepeng@centos ~]# echo {1..$clsn}
{1..6}

[lepeng@centos ~]# eval echo {1..$clsn}
1 2 3 4 5 6

06-Shell 编程之练习题
https://flepeng.github.io/021-Shell-06-Shell-编程之练习题/
作者
Lepeng
发布于
2016年1月1日
许可协议