第1章 自用练习题
1.1 命令行传入1个字符或数字,数字等于1则显示1,如果等于2则显示2,如果既不等于1也不等于2,就显示输入不对,然后退出程序
命令解析:
将外面参数 传入到脚本内 2. 判断参数是否是1,2
对显示 不对显示提示并推出
#!/bin/bash
num=$1
[ $# -eq 1 ] || {
echo 请输入1 或 2 其他不识别
exit 3
}
[[ $num =~ ^[12]$ ]] || {
echo 请输入1 或 2 其他不识别
exit 3
}
echo 你输入的是: $num
简化一下
[[ $num =~ ^[12]$ ]] || {
echo 请输入1 或 2 其他不识别
exit 3
}
echo 你输入的是: $num
1.2 命令行输入两个参数 对比大小后输出出来
解析要求:
传参到脚本内
判断参数是数值
比对大小后输出
#!/bin/bash
read -t 120 -p “Compare number num1 num2: ”n1 n2
expr $n1 + $n2 + 22 &>/dev/null
[ $? -eq 0 ] || {
echo Please enter two Numbers
exit 55
}
[ $n1 -eq $n2 ] && echo $n1 == $n2
[ $n1 -gt $n2 ] && echo $n1 > $n2
[ $n1 -lt $n2 ] && echo $n1 < $n2
1.3 书写简单的计算器
要求 : 从命令行输入2个参数 执行两个参数的加减乘除 参数不对时提示并推出脚本 计算它们的符号要显示出来
项目分析:
只能输入两个参数 多出来提示ds
必须是数字
运算
#!/bin/bash
num1=$1
num2=$2
[ $# -ne 2 ] && {
echo 请输入两个数字运算
exit 3
}
expr $num1 + $num2 + 22 &> /dev/null
[ $? -eq 0 ] || {
echo 请输入两个数字运算
exit 3
}
#另一种判断方法
[[ $num1 =~ ^-?[0-9]+$ && $num2 =~ ^-?[0-9]+$ ]] ||{
echo 请输入两个数字运算
exit 3
}
#计算区域
echo "$num1 + $num2 = $((num1+num2))"
echo "$num1 - $num2 = `expr $num1 - $num2`"
echo "$num1 \* $num2 = `awk "BEGIN {print $num1*$num2}"`"
echo "$num1 \ $num2 = `awk "BEGIN {print $num1/$num2}"`"
可完善点 小数点暂时无法计算
1.4 开发shell脚本监控服务是否在运行 要求传参方式监控各种服务
解析 :
取出服务运行进程
判断是否在运行 给出结果
#!/bin/bash
[ $# -eq 1 ] || {
echo Enter a service name
exit 22
}
service=$1
statusa=`ps -ef|grep -Ev “grep|$0”|grep -co $service`
if [[ $statusa -ge 1 ]]
then
echo $service Service in operation
else
echo $service server not found
fi
优化点 可固定某个服务 也可用read做交互式传参
1.5 去除一段信息中字符大于n的信息
例子 I am oldboy linux.welcome to our training.
取出大于6个的字符串
解析
主要应用特殊变量${#} 取出个数
for循环取出每个字符
if判断字符长度
#!/bin/bash
n=’ I am oldboy linux.welcome to our training.’
for i in $n
do
if [ ${#i} -ge 6 ]
then
echo $i
fi
done
1.6 产生随机数比对大小 让用户猜 每次都有大小提示
解析
产生随机数变量 $RANDOM
产生一个1-60随机数记录到一个变量中
RANDOM%61))
read -p 交互式让用户输入数值
判断用户输入的数值大小 并提示
正确推出脚本 显示猜的次数
#!/bin/bash
n=$((RANDOM%61))
num=0
while ture
raed -p “输入一个1-60的数字: ” n1
if [ $n -eq $n1 ]
then
((num++))
echo 回答正确 你一共猜了${n}次
break
elif [ $n1 -lt $n ]
then
((num++))
echo 小了
continue
elif [ $n1 -gt $n ]
then
((num++))
echo 大了
continue
fi
done
开发服务启动脚本
解析:
了解服务启动自带命令
了解指定服务关闭命令过程
判断是否在服务运行 并给与合理的响应
加入到systemctl管理中
rsync服务为例
start == rsync --daemon # 守护进程启动命令
stop == kill pid #kill pid # 关闭用kill命令+PID号
restart === # 先关闭在启动
#!/bin/bash
stat=$1
pid=/var/run/rsyncd.pid
# 判断参数是否正确
[[ $stat =~ start|restart|stop|enable|disable ]] ||{
echo "Please enter the [ start | restart | stop | enable | disable ]"
exit 33
}
# 启动
if [ "$stat" == "start" ]
then
if [ -s "$pid" ]
then
echo "rsyncd is running"
else
rsync --daemon
fi
fi
# 关闭
if [ "$stat" == "stop" ]
then
if [ -s "$pid" ]
then
kill `cat $pid`
else
echo "rsync is stop"
fi
fi
# 重启
if [ "$stat" == "restart" ]
then
if [ -s "$pid" ]
then
kill `cat $pid`
sleep 2
rsync --daemon
else
rsync --daemon
fi
fi
加入到systenctl管理中
centos6 chkconfig管理
在cenos6系统中 服务都由chkconfig 控制开机自启动
设置开机自启动方法
编写的脚本 第二行写入
# chkconfig: 2345 99 99
解析:
2345 代表那些级别开机时运行指定脚本
99 代表开机启动的顺序
99 代表关机关闭级别
centos 7 systemctl管理
需要在 /usr/lib/system/system/下编写配置文件 让systemctl管理各项服务
文件一共三个模块:
[Unti]
After=sshd #指定在什么服务后启动 (依赖)
重要部分
[Service]
Type=forking #默认就行
ExecStart=/etc/init.d/rsyncd start #开启执行脚本
ExecStop=/etc/init.d/rsyncd stop #关闭执行脚本
ExecReload=/etc/init.d/rsyncd restart #重启执行脚本
[Install]
WantedBy=multi-user.target # 启动级别
企业shell小项目
1.1 记录用户操作的小项目
核心使用$PROMPT_COMMAND变量
在用户登陆加载目录/etc/profile.d/下编辑脚本
#!/bin/bash\
exprort PROMPT_COMMAND=’
COM=$(history 1 |set -r “s#^[ 0-9]+##g”)
TIME=$(date +%F_%T)
WHO=$USER
echo $COM $TIME $WHO >>/var/log/history.log‘
readonly PROMPT_COMMAND HISTCONTROL
完善第一点 普通用户的操作能记录到log文件内 或 删除记录文件
赋予权限 让普通用户的操作能记录到文件内
chmod o+w /var/log/history
让普通用户无法删除/更改文件 将文件锁起来
chattr +ad /var/log/history
分割记录日志文件
判断执行命令和上一条一致时不记录
1.2 取出正在使用swap的进程名称 及占用swap的大小
第1步:取出1个进程的名称和占用的swap大小
第2步:取出所有进程 swap和进程名称
第3步:排坑
命令一般不好获得使用swap的进程号等信息
我们主要使用/proc/pid号/smaps文件和/proc/pid号/cmdline文件
/proc/pid号/smaps # 记录进程的smap空间占用情况
/proc/pid号/cmdline # 记录进程名字和使用的参数信息
扩展: /proc/sys # 记录内核信息
/proc/pid号/comm #记录进程号信息
例子
shell> ls -d /proc/[0-9]* # 查看所有PID对应的信息文件
shell> cat /proc/6737/smaps |grep Swap #查看对应pid进程占用的swap空间
Swap: 120 kB
Swap: 1384 kB
Swap: 0 kB
cat -A /proc/6737/cmdline # 查看对应pid的服务和启动参数
/usr/sbin/rsyslog\@-n # 可以看到 有特殊符号 不是人类可读的感觉
对于这些不听话的命令可以使用tr进行替换
tr '\0' ' '
/usr/sbin/rsyslogd -n
开始写脚本
#!/bin/baishi
for name in `ls -d /proc/[0-9]*`
do
pid_name=`tr ‘\0’ ‘ ’
[ -z $pid_name ] && continue
pid_swap=`awk -va=0‘/Swap:/{a+=$2} END {print a}’ $name/smaps
[ $pid_swap -ne 0 ] &&{
echo 进程名:$proc_name echo 占用空间:$swap_size
}
done