shell脚本实例
1.通过位置变量创建Linux系统账户及密码
位置变量:我们可以理解为 在执行脚本时所要传递的参数
#!/bin/bash useradd $1 echo "$2" | passwd --stdin "$1"
运行效果如下:

2.每周5使用tar命令备份/var/log下的所有日志文件
第一个*:一小时中的第几分钟【0-59】
- 第二个*:一天中的第几个小时【0-23】
- 第三个*:一个月当中的第几天【1-31】
- 第四个*:一年中的的第几月【1-12】
- 第五个*:一周当中对的星期几【0-7 0和7都表示 周日】
第一步 写好 备份脚本
#!/vin/bash tar -czf log-`date +%Y%m%d`.tar.gz /var/log
第二部 执行定时任务
crontab -e -u root 00 03 * * 5 /root/logbak.sh
3.监控本机内存和硬盘剩余空间,剩余内存小于 500M、根分区剩余空间小于 1000M
时,发送报警邮件给 root 管理员
#!/bin/bash echo "提取根分区剩余空间" gen_size=$(df / | awk '/\//{print $4}') echo "$gen_size" echo "提取内存剩余空间" mem_size=$(free |awk '/Mem/{print $4}') root_email="2387139415@qq.com" echo "$mem_size" if [ $gen_size -le 512000 -a $mem_size -le 1024000 ]; then echo "空间不足" | mutt -s "空间不足" $roor_email else echo "一切正常" fi
4.脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
猜小了或猜大了,直至用户猜对脚本结束
#!/bin/bash num=$[RANDOM%100] echo "$num" while : do read -p "请输入你的猜想数字:" my_num if [ $num -lt $my_num ]; then echo "猜大了" elif [ $num -gt $my_num ]; then echo "猜小了" else echo "恭喜你 才对了" break fi done ~
5.检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不
是,则提示您非管理员(使用字串对比版本)
#!/bin/bash #获取当前用户 name=$(whoami) echo "$name" if [ $name = "root" ]; then yum -y install vsftpd else echo "您不是管理员用户 没有权限安装软件" fi
6.依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
#!/bin/bash for i in {1..3} do read -p "请输入第${i} 个数字" num${i} done echo "$num1 $num2 $num3" tmp=0 #中间值 if [ $num1 -gt $num2 ]; then tmp=$num1 num1=$num2 num2=$tmp fi if [ $num1 -gt $num3 ]; then tmp=$num1 num1=$num3 num3=$tmp fi if [ $num2 -gt $num3 ]; then tmp=$num2 num2=$num3 num3=$tmp fi echo "排序后的数据为 : $num1 $num2 $num3"
7.编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(多进程版)
| 参数 | 详解 |
|---|---|
| -a | Audible ping. |
| -A | 自适应ping,根据ping包往返时间确定ping的速度; |
| -b | 允许ping一个广播地址; |
| -B | 不允许ping改变包头的源地址; |
| -c count | ping指定次数后停止ping; |
| -d | 使用Socket的SO_DEBUG功能; |
| -F flow_label | 为ping回显请求分配一个20位的“flow label”,如果未设置,内核会为ping随机分配; |
| -f | 极限检测,快速连续ping一台主机,ping的速度达到100次每秒; |
| -i interval | 设定间隔几秒发送一个ping包,默认一秒ping一次; |
| -I interface | 指定网卡接口、或指定的本机地址送出数据包; |
| -l preload | 设置在送出要求信息之前,先行发出的数据包; |
| -L | 抑制组播报文回送,只适用于ping的目标为一个组播地址 |
| -n | 不要将ip地址转换成主机名; |
| -p pattern | 指定填充ping数据包的十六进制内容,在诊断与数据有关的网络错误时这个选项就非常有用,如:“-p ff”; |
| -q | 不显示任何传送封包的信息,只显示最后的结果 |
| -Q tos | 设置Qos(Quality of Service),它是ICMP数据报相关位;可以是十进制或十六进制数,详见rfc1349和rfc2474文档; |
| -R | 记录ping的路由过程(IPv4 only); 注意:由于IP头的限制,最多只能记录9个路由,其他会被忽略; |
| -r | 忽略正常的路由表,直接将数据包送到远端主机上,通常是查看本机的网络接口是否有问题;如果主机不直接连接的网络上,则返回一个错误。 |
| -S sndbuf | Set socket sndbuf. If not specified, it is selected to buffer not more than one packet. |
| -s packetsize | 指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节; 包头+内容不能大于65535,所以最大值为65507(linux:65507, windows:65500); |
| -t ttl | 设置TTL(Time To Live)为指定的值。该字段指定IP包被路由器丢弃之前允许通过的最大网段数; |
| -T timestamp_option | 设置IP timestamp选项,可以是下面的任何一个: 'tsonly' (only timestamps) 'tsandaddr' (timestamps and addresses) 'tsprespec host1 [host2 [host3]]' (timestamp prespecified hops). |
| -M hint | 设置MTU(最大传输单元)分片策略。 可设置为: 'do':禁止分片,即使包被丢弃; 'want':当包过大时分片; 'dont':不设置分片标志(DF flag); |
| -m mark | 设置mark; |
| -v | 使ping处于verbose方式,它要ping命令除了打印ECHO-RESPONSE数据包之外,还打印其它所有返回的ICMP数据包; |
| -U | Print full user-to-user latency (the old behaviour). Normally ping prints network round trip time, which can be different f.e. due to DNS failures. |
| -W timeout | 以毫秒为单位设置ping的超时时间; |
| -w deadline | deadline; |
#!/bin/bash for i in {1..254} do ping -c2 -i0.3 -W1 10.0.0.$i &>/dev/null if [ $? -eq 0 ]; then echo "10.0.0.${i} is up" else echo "10.0.0.${i} is down" fi done
8.编写批量修改扩展名脚本
#!/bin/bash for i in {1..5} do touch chen${i}.txt done #以上是批量创建要测试的文件 path=`ls -a /root/shell/chen/*.txt` echo $path for j in $path do echo $j name=`echo $j |awk -F '.' '{print $1}'` mv $j $name.$1 done
9.切割 Nginx 日志文件(防止单个文件过大,后期处理很困难)
#/bin/bash logs_path="/usr/local/nginx/logs/" pid_path="/usr/local/nginx/logs/nginx.pid" mv ${logs_path}access.log ${logs_path}access_$(date +"%Y-%m-%d").log kill -USR1 `cat ${pid_path}`
10.检测 MySQL 数据库连接数量,超过500时报警并发送邮件给管理员

浙公网安备 33010602011771号