前言:shell脚本博大精深,本文只起到一个抛砖引玉的作用,望共同进步。
注:本文的shell编写目录,默认为/root/myshell目录下进行,案例中不再一一累述。
导引:本文给出的六个小案例,都给出了提纲,如对某个案例感兴趣,可根据提纲,直入主题。
1.示例一:随意输入两个整数,计算其平方和
方法一:使用系统预定义变量(非交互式)
1.编写脚本
#vim pingfang
脚本内容
#!/bin/bash
#count two number square sum
result=$(expr $1 \* $1 + $2 \* $2 )
echo "$1和$2的平方和=$result"
注:expr是算式的前缀,乘号由于是特殊字符,需要转义,每个计算符号前后,都需要有空格。$()的作用和反撇号一致。
2.验证脚本
#. pingfang 5 2 注:点后面有个空格
方法二:交互式(read -p)
1.编写脚本
#vim pingfang.sh
脚本内容
#!/bin/bash
#计算两个数的平方和
read -p "请随意输入两个整数,用于计算平方和(中间用空格隔开):" num1 num2
result=$(expr $num1 \* $num1 + $num2 \* $num2)
echo "$num1和$num2的平方和=$result"
注:read -p 可实现交互式输入。
2.验证脚本
#. pingfang.sh 运行并查看结果
2.示例二:对/etc/init.d下的服务,实现随意、启动 停止 当前状态的查看
#ls /etc/init.d 查看一下该目录下都有哪些服务
1.编写脚本
#vim service.sh
#!/bin/bash
/etc/init.d/$1 $2
注:$1 $2 是系统的预定义变量,此处也可以理解为在实际命令中的占位符(分别替换实际命令中的两个位置)。
2.验证脚本
#service.sh network stop
#service.sh network start
#service.sh network restart
3.示例三:过滤出本机ech网卡的MAC地址,并赋值给变量hwaddr
1.编写脚本
#vim hwaddr.sh
#!/bin/bash
Hwaddr=$(ifconfig | grep eth | awk '{print $2}')
echo "网卡的MAC地址:$Hwaddr"
注:| grep eth 从前面的结果集中,过滤出 带有eth字母的行
awk 命令是文本处理命令,很强大 {print $2 },打印出结果集的第二列。
2.验证脚本
#. hwaddr.sh 运行,查看结果
4.示例四:计算当前的内存使用百分比
1.编写脚本
#free -m 先查看一下内存使用情况
#vim memory.sh
#!/bin/bash
#free -m
mem_total=$(free -m | grep "Mem" | awk '{print $2}')
mem_used=$(free -m | grep "Mem" | awk '{print $3}')
echo "当前内存总大小为$mem_total M"
echo "已使用$mem_used M"
echo "当前内存已使用百分比为$(expr $mem_used \* 100 / $mem_total )%"
2.验证脚本
#. memory.sh 运行脚本;注:第一个点后面是有空格的
注:这里有个疑问,查看内存使用情况的时候,used是575,打印出来就变成576了,这里表示不太理解。
5.示例五:管理员在登录系统时显示如下信息
1)当前系统的登录用户的数量
2)当前运行的进程数量
3)当前使用的磁盘根分区的使用情况
1.编写脚本
#vim sysinfo.sh
#!/bin/bash
#show sysinfo
echo "root disk used info :"
df -h | grep "/$"LoginCount=$(who | wc -l )
PsCount=$(expr $(ps -aux | wc -l ) - 1 )
RootDiskUsed=$(df -h | grep "/$" | awk '{print $5}' )echo "当前登录系统的用户数量=$LoginCount"
echo "当前进程的数量=$PsCount"
echo "当前根分区已使用$RootDiskUsed"
注:wc -l 意思是对结果集的行数进行计算
ps -aux 显示当前所有线程
df -h 查看当前磁盘挂载以及使用情况。
2.验证脚本
#. sysinfo.sh
3.在开机启动项,添加此脚本使之开机自动运行
>给脚本赋予x执行权限,否则开机自动运行时会提示:bash: /root/myshell/sysinfo.sh: Permission denied 权限不足,被拒绝执行。
#chmod 744 /root/myshell/sysinfo.sh
或者
#chmod u+x /root/myshell/sysinfo.sh 给当前用户添加x执行权限
>编辑开机自动运行脚本
#vim /root/.bash_profile 注:这个是一个隐藏的文件,ll -a 才可以看到
脚本内容
/root/myshell/sysinfo.sh
4.在Xshell中再次验证
exit 退出Xshell,重新登录Xshell,查看效果
6.示例六:写一个监控脚本,记录CPU负载、内存和交换空间、磁盘空间、最近的用户登录情况等信息,以及当时的时间信息。
1.编写脚本
#vim monitor.sh
#!/bin/bash
CpuRec=`uptime`
MemRec=`free -m`
DiskRec=`df -hT`
LastUserLoginRec=`last -20`
RecTime=`date +"%Y-%m-%d %H:%M:%S"`
mkdir -p /var/log/runrec
RecFile=/var/log/runrec/runing-$(date +%Y%m%d%H%M)
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Record Time:
$RecTime
Cpu Load information:
$CpuRec
Memory information :
$MemRec
Disk use information :
$DiskRec
Last login 20 users record :
$LastUserLoginRec "#>>$RecFile
注:这个案例里面的命令,都比较好理解,可以随意单独拿出来,看运行结果。其中
uptime 是看cup负载情况的 ;
最后一行“#>>$RecFile” 意思是把如上打印信息,输出到以时间命名的文件内(文件不存在则会自动生成)
2.验证脚本
#. monitor.sh 运行脚本
#cd /var/log/runrec 切换到日志目录
#ls 查看生成的日志文件列表
3.编辑计划任务,使之每个小时执行一次
#crontab -e 打开计划任务编辑器
计划任务脚本内容 (脚本也比较简单:前面定义运行周期,依次用空格隔开,后面写脚本路径)
* 1 * * * /root/myshell/moitor.sh
:wq 保存并退出。
注:计划任何的执行时间,从前到后,依次是 分 、小时、日、月、星期(一个星期中的周几)。*代表不限具体某个对应时间。
具体说明可以输入命令:#vim /etc/crontab 查看计划任务的时间说明
此时,每隔一个小时,就可以看到日志文件中多一个日志了。