脚本练习

注:以下脚本练习实验都是以root用户身份执行的,若普通用户运行需要另加相应的权限

1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。

[root@fengl bin]# vim systeminfo.sh
[root@fengl bin]# chmod u+x systeminfo.sh
[root@fengl bin]# cat systeminfo.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
HostName=`hostname`
IpAddr=`ifconfig | grep netask && ifconfig | grep Mask || ifconfig | grep Mask | tr -s ' '|cut -d' ' -f3|cut -d':' -f2 | grep -v '127.0.0.1' | tr '\n' ' ' && ifconfig | grep netmask | tr -s ' '|cut -d' ' -f3 | grep -v '127.0.0.1'|tr '\n' ' '`
Version=`cat /etc/centos-release`
Kernel=`uname -r`
CPU=` lscpu | grep "Model name"|tr -s ' '|cut -d: -f2`
Mem=`free -h|grep 'Mem'|tr -s ' '|cut -d: -f2|cut -d' ' -f2`
Disk=`fdisk -l|sed -n '2p'|cut -d: -f2`
echo -e "\033[31;1mHostName\033[0m:\033[32;1m$HostName\033[0m"
echo -e "\033[31;1mIPv4Addr\033[0m:\033[32;1m$IpAddr\033[0m"
echo -e "\033[31;1mOS Version\033[0m:\033[32;1m$Version\033[0m"
echo -e "\033[31;1mKernel\033[0m:\033[32;1m$Kernel\033[0m"
echo -e "\033[31;1mCPU model name\033[0m:\033[32;1m$CPU\033[0m"
echo -e "\033[31;1mMemory\033[0m:\033[32;1m$Mem\033[0m"
echo -e "\033[31;1mDisk\033[0m:\033[32;1m$Disk\033[0m"

1.png

2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中

[root@fengl bin]# vim backup.sh
[root@fengl bin]# chmod u+x backup.sh 
[root@fengl bin]# cat backup.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:每日将/etc/目录备份到/root/etcYYYY-mm-dd中
BackDir="/root/etc`date +%F`"
SourceDir="/etc"
echo "正在备份/etc目录下的文件,请等待..."
cp -a "${SourceDir}"/. "${BackDir}"
SFile="/root/.sfile`date +%F`"
BackFile="/root/.backfile`date +%F`"
echo "正在检测备份文件,请等待..."
[[ -d "${BackDir}" ]] && ls -aR ${BackDir} > ${BackFile} && sed -i 's@'${BackDir}'@/etc@g' "${BackFile}" && ls -aR ${SourceDir} > ${SFile} && [[ "`cat ${BackFile}`" == "`cat ${SFile}`" ]] && echo "备份成功" || echo -e "\033[31;1m备份失败,请重新备份\033[0m" && rm -f {${SFile},${BackFile}}

注:脚本中验证备份文件功能只是为了练习,实际上没有多大意义

2.png

2-2.png

3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值及分区

[root@fengl bin]# vim disk.sh
[root@fengl bin]# chmod u+x disk.sh 
[root@fengl bin]# cat disk.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:显示当前硬盘分区中空间利用率最大的值及分区
MaxNum=`df|grep "^/dev/sd"|tr -s ' '|cut -d' ' -f5|tr -d '%'|sort -nr|head -1`
Partition=`df|tr -s ' '|cut -d' ' -f1,5|grep "${MaxNum}"|cut -d' ' -f1|tr '\n' ' '`
echo -e "\033[31;1m当前硬盘分区中空间利用率最大值为\033[0m:\033[32;1m${MaxNum}%\033[0m"
echo -e "\033[31;1m当前硬盘分区中空间利用率最大的分区为\033[0m:\033[32;1m${Partition}\033[0m"

3.png

4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

[root@fengl bin]# vim links.sh
[root@fengl bin]# chmod u+x links.sh
[root@fengl bin]# cat links.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:显示连接当前主机的每个远程主机IPv4地址及连接数,并按连接数从大到小排序
echo -e "\t连接数\t远程主机"
netstat -nt|grep 'tcp'|tr -s ' '|cut -d' ' -f5|cut -d: -f1|uniq -c|tr -s ' '|sort -nr|tr ' ' '\t'

4.png

5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

[root@fengl bin]# vim sumid.sh
[root@fengl bin]# chmod u+x sumid.sh
[root@fengl bin]# cat sumid.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:计算/etc/passwd文件中的第10个用户和第20用户的ID之和
Uid10th=` sed -n '10p' /etc/passwd|cut -d: -f3`
Uid20th=` sed -n '20p' /etc/passwd|cut -d: -f3`
SumUid=$[Uid10th+Uid20th]
echo -e "/etc/passwd文件中的第10个用户和第20个用户的ID之和为:\033[32;1m$SumUid\033[0m"

5.png

6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

[root@fengl bin]# vim sumspace.sh 
[root@fengl bin]# chmod u+x sumspace.sh
[root@fengl bin]# cat sumspace.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:传递两个文件路径作为参数给脚本,计算出两个文件中所有空白行之和

#判断是否输入两个参数,否则退出并提示
[[  "$#" -ge 2 ]] || echo -e "\033[31;1m请输入两个文件路径作为参数\033[0m"
[[  "$#" -ge 2 ]] || exit
#判断参数1是否为文件路径,否则退出并提示
[[ -f "$1" ]] || echo -e "\033[31;1m第一个输入的文件路径${1}不存在,请重新输入一个正确的文件路径作为参数\033[0m"
[[ -f "$1" ]] || exit
#判断参数2是否为文件路径,否则退出并提示
[[ -f "$2" ]] || echo -e "\033[31;1m第二个输入的文件路径${2}不存在,请重新输入一个正确的文件路径作为参数\033[0m"
[[ -f "$2" ]] || exit
#分别定义两个变量记录文件1和文件2中空白行的个数
File1Num=`grep '^$' $1| wc -l`
File2Num=`grep '^$' $2| wc -l`
#计算文件1和文件2中空白行个数之和
let Sum=${File1Num}+${File2Num}
#输出文件1和文件2中空白行个数之和
echo -e "\033[33;1m$1和$2中所用空白行之和为\033[0m:\033[32;1m${Sum}\033[0m"

6.png

7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

[root@fengl bin]# vim sumfile.sh
[root@fengl bin]# chmod u+x sumfile.sh
[root@fengl bin]# cat sumfile.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:统计/etc, /var, /usr目录中共有多少个一级子目录和文件
EtcNum=`ls -A /etc/|wc -l`
VarNum=`ls -A /var/|wc -l`
UsrNum=`ls -A /usr/|wc -l`
Sum=$((EtcNum+VarNum+UsrNum))
echo -e "\033[31;1m/etc,/var,/usr目录中的一级子目录和文件共有\033[0m:\033[32;1m${Sum}\033[0m"

7.png

8、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

[root@fengl bin]# vim argsnum.sh
[root@fengl bin]# chmod u+x argsnum.sh
[root@liang7 bin]# cat argsnum.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:统计第一个参数路径文件的空白行数

#判断是否输入参数,否则提示并退出
[[ $# -lt 1 ]] && echo -e "\033[31;1m请至少输入一个文件路径作为参数\033[0m" && exit
#判断输入的是否文件路径,否则提示并退出
[[  -f $1  ]] || echo -e "\033[31;1m输入的文件路径不存在,请在argsnum.sh后面重新输入一个正确的文件路径作为参数\033[0m" 
[[  -f $1  ]] || exit
#计算第一个参数文件中空白行数
FileSpaceLineNum=`grep '^$' $1|wc -l`
#输出第一个参数文件中空白行数
echo -e "\033[31;1m第一个参数文件中的空白行数为\033[0m:\033[32;1m${FileSpaceLineNum}\033[0m"

8.png

9、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

[root@fengl bin]# vim hostping.sh
[root@fengl bin]# chmod u+x hostping.sh
[root@fengl bin]# cat hostping.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:输入一个IPv4地址作为参数,测试是否能够ping通并提示

#判断有无参数,若无参数则提示并退出
[[ -z $@ ]] && echo -e "\033[31;1m请输入一个IPv4地址作为参数\033[0m" && exit
#判断是否只有一个参数,如果有多个参数则提示并退出
[[ $# -gt 1 ]] && echo -e "\033[31;1m只能输入一个参数作为IPv4地址\033[0m" && exit
#判断参数是否为有效的IPv4地址,若不是则提示并退出
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 || echo -e "\033[31;1m请输入一个正确的IPv4地址\033[0m"
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 || exit
#ping该IPv4地址,并反馈结果
echo -e "\033[31;1m正在 ping "$1",请等待...\033[0m"
ping -c2 -W2 "$1" &> /dev/null && echo -e "\033[32;1m主机"$1"可访问\033[0m" || echo -e "\033[31;1m主机"$1"不可访问\033[0m"

9.png

10、chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写(因考虑到普通用户调用该脚本权限问题,故将脚本路径放到了/tmp/目录下,并且该脚本还可以判该文件的其他权限)

[root@fengl tmp]# vim per.sh 
[root@fengl tmp]# chmod 745 per.sh
[root@fengl tmp]# cat per.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:判断当前用户对某文件的读、写、执行权限并提示

#定义要检测文件的路径变量并赋值
SourceFile=/tmp/file1
#定义要检测文件的权限变量并赋值
[[ -r "${SourceFile}" ]]
Read=`echo $?`
[[ -w "${SourceFile}" ]]
Write=`echo $?`
[[ -x "${SourceFile}" ]]
Execute=`echo $?`
#检测当前用户对该文件的读、写、执行权限
[[ "${Read}" -eq 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[32;1m当前用户对${SourceFile}文件有读、写、执行权限\033[0m"
#检测当前用户对该文件的读、写权限
[[ "${Read}" -eq 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[34;1m当前用户对${SourceFile}文件有读、写权限\033[0m"
#检测当前用户对该文件的读、执行权限
[[ "${Read}" -eq 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[34;1m当前用户对${SourceFile}文件有读、执行权限\033[0m"
#检测当前用户对该文件的写、执行权限
[[ "${Read}" -gt 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[33;1m当前用户对${SourceFile}文件有写、执行权限\033[0m"
#检测当前用户对该文件的读权限
[[ "${Read}" -eq 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[34;1m当前用户对${SourceFile}文件只有读权限\033[0m"
#检测当前用户对该文件的写权限
[[ "${Read}" -gt 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[33;1m当前用户对${SourceFile}文件只有写权限\033[0m"
#检测当前用户对该文件的执行权限
[[ "${Read}" -gt 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[33;1m当前用户对${SourceFile}文件只有执行权限\033[0m"
#检测当前用户对该文件无任何权限
[[ "${Read}" -gt 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[31;1;5m当前用户对${SourceFile}文件无任何权限\033[0m"

下面图1是root用户更改file1权限的截图,图2是普通用户针对file1文件不同权限的测试结果截图

图1:

10.png

图2:

GIF.gif

11、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。

[root@fengl bin]# vim nologin.sh 
[root@fengl bin]# chmod u+x nologin.sh
[root@fengl bin]# cat nologin.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:禁止普通用户登录

#检测/etc目录下有无nologin文件,并定义回执变量
[[ -f /etc/nologin ]]
EtcReturnNum=`echo $?`
#检测/run目录下有无nologin文件,并定义回执变量
[[ -f /run/nologin ]]
RunReturnNum=`echo $?`
#禁止普通用户登录
[[ ${EtcReturnNum} -eq 0 ]] || [[ ${RunReturnNum} -eq 0 ]] && echo -e "\033[31;1m已禁止普通用户登录该系统\033[0m" && exit
[[ $"EtcReturnNum" -gt 0 ]] && [[ $"RunReturnNum" -gt 0 ]] && touch /etc/nologin && echo -e "\033[31;1m已禁止普通用户登录该系统\033[0m"

11.png

[root@fengl bin]# vim login.sh 
[root@fengl bin]# chmod u+x login.sh
[root@fengl bin]# cat login.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:允许普通用户登录

#检测/etc目录下有无nologin文件,并定义回执变量
[[ -f /etc/nologin ]]
EtcReturnNum=`echo $?`
#检测/run目录下有无nologin文件,并定义回执变量
[[ -f /run/nologin ]]
RunReturnNum=`echo $?`
#允许普通用户登录
[[ $"EtcReturnNum" -eq 0 ]] && rm -f /etc/nologin
[[ $"RunReturnNum" -eq 0 ]] && rm -f /run/nologin
echo -e "\033[32;1m已允许普通用户登录该系统\033[0m"

11-2.png

12、计算1+2+3+…+100的值

[root@fengl bin]# vim sum.sh
[root@fengl bin]# chmod u+x sum.sh
[root@fengl bin]# cat sum.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:计算1~10的和

#指定数字范围变量
Num=`echo {1..100}`
#计算求和
#方法一:
#let sum=`echo $Num | tr -t ' ' '+'`
#方法二:
#sum=$[`echo $Num | sed 's@[[:space:]]@+@g'`]
#方法三:
#sum=$((`seq 1 100 | tr -t '\n' '+'|sed 's@+$@@'`))
#方法四:
#sum=$(expr `seq 1 100|tr -t '\n' '+'|sed 's@+@ + @g'|sed 's@ + $@@'`)
#方法五:
sum=`echo $Num|tr -t ' ' '+'|bc`
echo -e "\033[32;1m1~100的和为\033[0m:\033[33;1m${sum}\033[0m"

12.png

13、计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之

[root@fengl bin]# vim parametersum.sh 
[root@fengl bin]# chmod u+x parametersum.sh 
[root@fengl bin]# cat parametersum.sh 
#!/bin/bash
#Author:liang
#Version:1.0
#Description:计算该脚本第一个参数中所有数字和第二个参数中的所有数字之和,并判断第二个参数中所有数字之和是否大于第一个参数中所有数字之和,是则计算,否则提示错误并退出

#检测是否有参数
[[ $# -ge 2 ]] || echo -e "\033[31;1m请至少输入两个带有数字的参数\033[0m"
[[ $# -ge 2 ]] || exit
#检测参数知否有效
echo $1|grep '[0-9]\+' &> /dev/null || echo -e "\033[31;1m参数${1}无效,请重新输入\033[0m"
echo $1|grep '[0-9]\+' &> /dev/null || exit
echo $2|grep '[0-9]\+' &> /dev/null || echo -e "\033[31;1m参数${2}无效,请重新输入\033[0m"
echo $2|grep '[0-9]\+' &> /dev/null || exit
#分别取出第一个参数和第二个参数中的所有数字,并分别计算每个参数中的数字之和
NumA=`echo $1 | grep -o '[0-9]\+'|tr -d '\n'`
NumB=`echo $2 | grep -o '[0-9]\+'|tr -d '\n'`
SumA=$[`echo ${NumA} | sed 's@[0-9]@&+@g' | sed 's@+$@@'`]
SumB=$[`echo ${NumB} | sed 's@[0-9]@&+@g' | sed 's@+$@@'`]
#检测第二个参数中的数字之和是否大于第一个参数中的数字之和
[[ ${SumB} -gt ${SumA} ]] || echo -e "\033[31;1m第二个参数中数字之和小于或等于第一个参数中的数字之和,请重新输入\033[0m"
[[ ${SumB} -gt ${SumA} ]] || exit
#计算两个参数中的所有数字之和
SumAB=$[SumA+SumB]
echo -e "\033[33;1m两个参数中所有数字之和为\033[0m:\033[32;1m${SumAB}\033[0m"

13.png

原创文章,作者:苦涩咖啡,如若转载,请注明出处:http://www.178linux.com/34178

(0)
苦涩咖啡苦涩咖啡
上一篇 2016-08-15
下一篇 2016-08-15

相关推荐

  • sudo——让普通用户更灵活

    sudo命令 1、sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用sudo ,会提示联系管理员 2、sudo可以提供日志,记录每个用户使用sudo 操作 3、sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机 4、sudo 使用时间戳文件来完成类似“检票”的 系统,默认存活期为5 分钟的 “入场券” …

    Linux干货 2016-09-25
  • Infobright高性能数据仓库

    1.  概述         Infobright是一款基于独特的专利知识网格技术的列式数据库。Infobright简单易用,快速安装部署,使用中无需复杂操作,能大幅度减少管理工作;在应对50TB甚至更多数据量进行多并发复杂查询时,更能够显示出令人惊叹的速度。相比于MySQL,其查询速度提升了数倍甚…

    Linux干货 2015-04-05
  • 基于rsync+inotify实现数据实时同步传输

    前言 与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,但随着文件数量的增大和实时同步的要求,rsync已不能满足需求,随之rsync+inotify便应运而生。本文将讲解rsync的基础知识和如何基于rsync+inotify实现数据实时同步传输。 rsync相关介…

    Linux干货 2015-04-27
  • Linux基础目录名称命名法则及功能规定

    Linux中有非常多的目录文件,那么这些目录文件的命令规则,和功能都有那些,今天学习了下,下面是我的学习记录,跟大家分享下。 文件命名规则 (1) 除了/之外,所有字符都合法 (2) 特殊字符如@、#、¥、&、()、-、空格等最好不要使用,当使用空格作为文件名时,执行命令会出错 (3) 避免使用”.”作为文件名的第一个字符,因为在Linux系统中以”…

    Linux干货 2016-08-15
  • 压缩和解压缩总结

                      压缩和解压缩的命令很多,今天总结如下: gzip  压缩比1–9  默认是6  压缩比越高  耗费CPU资源也多,文件比较小的话,不建议使用gzip压缩,因为使用gzip越压缩越大。…

    Linux干货 2017-04-17
  • linux中文本处理工具

      对于linux来讲,文本处理是非常重要的,因为linux系统就是由无数的文件组成的,linux中一切皆文件。文件的处理方式有很多种,所以就有众多的文本处理工具,各自作用于不同的文本处理方式。 一、查看文件命令:    cat命令:处理显示文件内容,不改变原文件    cat命令常用于查看文件内容,也可通过…

    Linux干货 2016-08-08