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 09:29
下一篇 2016-08-22 09:29

相关推荐

  • 常见HTTP code大全

    1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。 代码 说明 100 (继续) 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。  101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。 2xx (成功)表示成功处理了请求的状…

    Linux干货 2016-09-19
  • Linux基础知识之IO重定向

    该博文以CentOS6.8_x86_64系统为基础,Xshell 5远程连接CentOS系统,以root身份登录系统。  什么是I/O重定向?       所谓I/O重定向简单来说就是一个过程,这个过程捕捉一个文件,或者命令,程序,脚本,甚至脚本中的代码块(codeblock)的输出,然后把捕捉到的输出,作为输入发送给…

    Linux干货 2016-07-26
  • 第三周学习总结之简单文本处理

    写在最前 通过前面的学习,我们已经知道Linux是一个一切皆文件的系统,因此对文件的处理就显得尤为重要,到目前为止,对于新手来说可能连鼎鼎大名的三剑客也未必听过,不过在这之前我们也可以使用一些非常好用的文本处理工具来完成一些简单文件的处理。本次内容就是讲讲如何使用几个简单文本处理工具的组合完成一些实用的功能。 文本处理工具 文本处理工具,用我的理解就是能够对…

    2017-12-19
  • Linux 用户, 组和权限

    用户, 组和权限 Linux登陆需要用户名、密码。/etc/passwd 文件保存用户名。登录linux时,Linux 先查找 /etc/passwd 文件中是否有这个用户名,没有则跳出,有则读取用户名的user ID 、 group ID 、用户名对应的根目录路径以及所使用的 shell ,最后在 /etc/shadow 中核对该 UI…

    2017-07-22
  • linux的文件类型

    linux的文件类型 linux其中的一个哲学思想就是一切皆文件,今天我们就来学习一下linux系统中的文件类型。linux不同于windows,有多种多类的文件类型,文件类型的判断也不是以文件的后缀为标准的。linux中一共有七种文件类型,分别是:普通文件、目录、字符设备文件、块设备文件、套接字文件、命名管道文件和符号链接文件。那么接下来我们就分别看看每种…

    Linux干货 2016-10-27
  • 文本三剑客之awk

    文本三剑客之awk 简介      awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这…

    2017-09-06