0811:脚本练习

系统信息获取脚本

1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。
[root@centos7 scripts]#cat systeminfo.sh 
#!/usr/bin/bash 
server_ip=`ifconfig | grep 'inet\b'  | grep -v '127.0.0.1' | tr -s ' '  | cut -d' '  -f3`
CPUmod=`lscpu | grep -i "model name:"`
Meninfo=`free -h | sed -n '2p' | tr -s ' ' | cut -d' ' -f2`
DISKinfo=`fdisk -l | sed -n '2p' | sed -r 's/.*[[:space:]]([0-9].*GB).*/\1/g'` 
echo 'hostname :'$(hostname)
echo 'hostIP:'${server_ip}
echo 'OS version:'$(cat /etc/redhat-release)
echo 'Kernel version:'$(uname -r)
echo 'CPU '$CPUmodecho 'Memory :'$Meninf
oecho 'Harddisk:'$DISKinfo
2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
[root@centos7 scripts]#cat backup.sh 
#!/usr/bin/env bash 
backdir="/root/etc$(date +%F)"
cp -a /etc/. $backdir && echo " backup $backdir  finished."
3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
[root@centos7 scripts]#cat disk.sh  
#!/usr/bin/env bash 
maxdisk=`df | grep '/dev/sd' | tr -s ' ' | sort -nr -t' ' -k5 | head -1 | cut -d' ' -f1`
maxused=`df | grep '/dev/sd' | tr -s ' ' | sort -nr -t' ' -k5 | head -1 | cut -d' ' -f5` 
echo '分区利用率最大值为:'$maxused
4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排
[root@centos7 scripts]#cat links.sh 
#!/usr/bin/env bash 
echo -e "远程主机连接统计为:\n\t连接数\t远程主机IP"
netstat -nt | tr -s ' ' | cut -d' ' -f5 | tr -cs '0-9.' '\n' | egrep '([0-9]+.){3}[0-9]+' | sort | uniq -c | sort -nr | tr -s ' ' '\t'

计算脚本

5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
[root@centos7 scripts]#cat sumid.sh 
#!/usr/bin/env bash

UID1=`sed -n '10p' /etc/passwd | cut -d: -f3`
UID2=`sed -n '20p' /etc/passwd | cut -d: -f3`
let Sumid=$UID1+$UID2 
echo -e "The 10 user ID is $UID1 ;\nthe 20 user ID is $UID2 ;\n\tthe sum of two users ID is $Sumid ."
6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
[root@centos7 scripts]#cat sumspace.sh 
#!/usr/bin/env bash
File1=`grep '^$' $1 | wc -l`
File2=`grep '^$' $2 | wc -l`
let Sumspace=$File1+$File2 
echo "the sum of $1 and $2 spacelines is $Sumspace" 
unset File1
unset File2 
unset Sumspace
7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var,/usr目录中共有多少个一级子目录和文件
[root@centos7 scripts]#cat sumfile.sh 
#!/usr/bin/env bash
File1=`ls -A /etc | wc -l`
File2=`ls -A /var | wc -l`
File3=`ls -A /usr | wc -l` 
let Sumfile=$File1+$File2+$File3 
echo "the sum is $Sumfile " 
unset File1
unset File2
unset File3
unset Sumfile

测试大小练习:

8、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
[root@centos7 bin]#cat argsnum.sh 
#!/bin/bash
linespace=$([[ $# -lt 1 ]] && echo "至少应该给一个参数" && exit || cat $1 | grep "^$" | wc -l)
echo "$1文件中,空白行数为$linespace。" 
unset $linespace
9、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
[root@centos7 bin]#cat hostping.sh 
#!/bin/bash
ping -c1 -W1 $1 && echo "该IP地址可访问" || echo "该IP地址不可访问"
# ping命令的参数中,-c表示发送多少个包,-W表示等待多久(单位s)。

文件存在性练习:

10、chmod-rw /tmp/file1,编写脚本/root/bin/per.sh判断当前用户对/tmp/fiile1文件是否不可读且不可写
[root@centos7 bin]#cat per.sh
#!/bin/bash
fileName=/tmp/file1
[ -r $fileName ] || [ -w $fileName ] && echo "file can be read or can be written " || echo "file can not be read or the file can not be written"
11、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。
#!/bin/bash
read -p " if you want regular users login press y, or press n " relog
case $relog in
[Yy]|[Yy][Ee][Ss]):
        [[ -f /etc/nologin ]] && rm -f /etc/nologin &> /dev/null && echo "regular users can login now" || echo "regular users can login, no change occure"
                ;;
[Nn]|[Nn][Oo]):
        [[ ! -f /etc/nologin ]] && echo > /etc/nologin || echo "file already exist"
        ;;
*)
        echo "please input right."esac

【易错点】

  • case的格式:

case $var in
     case1)
            COMD
            ;;
     case2)
            COMD
            ;;
     *)
            OTHERS
esac
  • case1)后面,可以有冒号,也可以没有冒号。也就是case1):也是正确的

  • [Yy] | [Yy][Ee][Ss]的表示

    [Yy]表示Y或者y 
    [Yy][Ee][Ss]很出彩

课后作业

12、写一个脚本/root/bin/hostping.1.sh,接受一个主机的IPv4地址作为参数,先判断是否合格IP,否,提示IP错误。
#!/bin/bash
red='\e[31;1m'
end='\e[0m'
green='\e[32;1m'
[[ -z $@ ]] && echo -e "$red 请输入一个IPv4地址作为参数 $end" && exit 
[[ $# -gt 1 ]] && echo -e "$red 只能输入一个参数作为IPv4地址 $end" && exit 
echo "$1"|grep -E '^([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' &> /dev/null
var=$(echo $?)
[[ $var -ne 1 ]] || echo -e "$red 请输入一个正确的IPv4地址 $end" 
[[ $var -eq 1 ]] && exit 
echo -e "$red 正在 ping "$1",请等待...$end"
ping -c2 -W2 "$1" &> /dev/null && echo -e "$green 主机"$1"可访问 $end" || echo -e "$red 主机"$1"不可访问 $end"

0811:脚本练习
【难点】

  • 判断后的“echo输出”和退出,不能够连续,如果多次判断,需要进行多次判断ip,所以赋值变量,耗费cpu时钟少一些

  • 注意IP判断的正则表达式:^( [1-9] | [1-9][0-9] | 1[0-9]{2} | 2[0-4][0-9]] | 25[0-5]) . (([0-9] | [1-9][0-9] | 1[0-9]{2} | 2[0-4][0-9] | 25[0-5]) . ) {2} ( [0-9] | [1-9][0-9] | 1[0-9]{2} | 2[0-4][0-9] | 25[0-5] ) $

  • IP地址判断这里,可以替换为:^([1-255].([0-255].){2}[0-255]$,这样更简单好记一些

13、计算1+2+3……+100的值
#!/bin/bash
i=1sum=0
while [ $i -le 100 ] ;do
    sum=$(expr $sum + $i )
    let i++
done
echo $sum

0811:脚本练习
【易错】

  • expr使用时,每个字符和变量之间需要有空格!

14、计算从A开始,到B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之。
#!/bin/bash#[[ $# -lt 2 ]] && echo "至少需要两个不同的整数作为参数,第一个参数需要小于第二个参数" && exit[[ $1 =~ ^[[:digit:]]+$ ]][ $? -ne 0 ] && echo "第一个参数必须为整数" && exit[[ $2 =~ ^[[:digit:]]+$ ]][ $? -ne 0 ] && echo "第二个参数必须为整数" && exit[[ $1 -eq $2 ]] && echo "两个整数不能相同" && exit[[ $1 -ge $2 ]] && echo "第一个参数需要小于第二个参数" && exitecho -n "$1到$2之间所有整数的和为"seq -s+ $1 $2 | bc

0811:脚本练习
【重点】

  • 使用[ [ ] ] 进行数字的匹配。[ [ 2= [[:digit:]]+2= [[:digit:]]+ ] ],这里如果使用[ [ 2= \b[[:digit:]]+\b]][[2= \b[[:digit:]]+\b]]是不能得到正确结果的,[[2 =~ \<[ [ : digit : ] ] + > ] ]也是不能有正确的结果

原创文章,作者:m20-吴清玲,如若转载,请注明出处:http://www.178linux.com/37752

(0)
m20-吴清玲m20-吴清玲
上一篇 2016-08-22
下一篇 2016-08-22

相关推荐

  • CentOS、RHEL及Linux的关系

    什么是Linux?    Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux存在着…

    Linux干货 2016-01-14
  • Linux运维实战之2-2:bash的工作特性

    这次博文我们主要来谈谈bash的工作特性哈。 主要内容: bash是一种shell解释程序     bash工作特性之命令状态返回值 bash工作特性之命令行展开 bash工作特性之命令补全 bash工作特性之路径补齐 bash工作特性之命令引用 bash工作特性之命令别名 bash工作特性之文件名通配 bash工作特性之命令hash 问…

    Linux干货 2016-11-06
  • 推荐-使用iptables作为网络防火墙构建安全的网络环境

    使用iptables作为网络防火墙构建安全的网络环境 使用iptables作为网络防火墙构建安全的网络环境 前言 网络防火墙的优势 实验拓扑图 实验环境 实验步骤 防火墙未设置前对所有服务器的测试 针对不同服务器进行”非法”访问 定义网络防火墙规则 再次针对不同服务器进行”非法”访问 测试服务器是否可访问 总结 前言 一般情况下iptables只作为主机防火…

    Linux干货 2016-03-31
  • 计算机的组成及Linux简单介绍

    马哥教育网络班22期第一周练习 计算机概述 进入计算机的世界 计算机 计算机(computer)俗称电脑,是能够按照程序运行,自动、高速出炉海量数据的现代化智能电子设备。由硬件系统和软件系统所组成,计算机的组成遵循冯诺依曼体系。可分为超级计算机、工业控制计算机、网络计算机、个人计算机和嵌入式计算机等五类,较先进的计算机有生物计算机、光子计算机、量子计算机等。…

    Linux干货 2016-08-14
  • Οι κωδικοποιητές software πίσω από τη συλλογή παιχνιδιών του Efbet Casino

    Όταν εξερευνάτε την πολυποίκιλη συλλογή παιχνιδιών του Efbet Casino, έρχεστε σε επαφή με το έργο προηγμένων ομάδων ανάπτυξης που έχουν μεταμορφώσει την πλατφόρμα από το 2006. Η πρό…

    Linux干货 3天前
  • RAID(重要)

    RAID   RAID(Redundent Array of Independent Disk):独立的冗余磁盘阵列,目的是为了结合多个物理驱动器组成单个单元,提高了磁盘的性能或保证数据冗余。RAID能够防止硬件的故障导致数据丢失,但是不能防止人为操作,软件故障、恶意软件感染等造成的数据丢失,因此不能替代备份。 分类有:硬件实现RAID(一是外接式磁盘阵列柜…

    Linux干货 2016-08-30