zoukankan      html  css  js  c++  java
  • 编写shell管理脚本(二)

    8.1  先测试“/etc/vsftpd”、“/etc/hosts”是否为目录,并通过“$?”变量查看返回状态值,据此判断测试结果。
    [root@localhost ~]# [ -d /etc/vsftpd ]
    [root@localhost ~]# echo $?
    0
    [root@localhost ~]# [ -d /etc/hosts ]
    [root@localhost ~]# echo $?
    1
    [root@localhost ~]# ls -ld /etc/vsftpd /etc/hosts
    -rw-r--r-- 2 root root  187 10-17 13:53 /etc/hosts
    drwxr-xr-x 2 root root 4096 10-18 13:31 /etc/vsftpd
    8.2  测试“/media/cdrom/Server”及其父目录是否存在,如果存在则显示“YES”,否则不输出任何信息。
    [root@localhost ~]# [ -e /media/cdrom/Server ] && echo "YES"
                                                  //无输出表示该目录不存在
    [root@localhost ~]# [ -e /media/cdrom ] && echo "YES"
    YES                                           //显示YES表示该目录存在
    8.3  使用普通用户teacher登录,并测试是否对“/etc/passwd”文件有读、写权限,如果是则显示“YES”。
    [teacher@localhost ~]$ [ -w /etc/passwd ] && echo "YES"
    [teacher@localhost ~]$ [ -r /etc/passwd ] && echo "YES"
    YES
    8.4  测试当前登录到系统中的用户数量是否小于或等于10,是则输出“YES”。
    [root@localhost ~]$ who | wc -l
    2
    [root@localhost ~]$ [ `who | wc -l` -le 10 ] && echo "YES"
    YES
    8.5  提取出“/boot”分区的磁盘使用率,并判断是否超过95%(为了便于理解,操作步骤以适当进行分解)。

    8.6  提示用户输入一个文件路径,并判断是否是“/etc/inittab”,如果是则显示“YES”。
    [root@localhost ~]# df -hT | grep "/boot" | awk '{print $6}'
    [root@localhost ~]# read -p "Localtion: " FilePath 
    Localtion: /etc/inittab   
    [root@localhost ~]# [ $FilePath = "/etc/inittab" ] && echo "YES"
    YES
    8.7  若当前环境变量LANG的内容不是“en.US”,则输出LANG变量的值,否则无输出。
    [root@localhost ~]# [ $LANG != "en.US" ] && echo $LANG
    zh_CN.UTF-8
    8.8  使用touch命令建立一个新文件,测试其内容是否为空,向文件中写入内容后,再次进行测试。
    [root@localhost ~]# touch zero.file
    [root@localhost ~]# [ -z 'cat zero.file' ] && echo "YES"
    YES                                      //表示该文件为空文件
    [root@localhost ~]# [ -z 'cat zero.file' ] && echo "YES"
    [root@localhost ~]# echo "something" > zero.file
    [root@localhost ~]# [ -z 'cat zero.file' ] && echo "YES"
                                             //无输出表示文件不为空
    8.9  测试当前的用户是否是teacher,若不是则提示“Not teacher”。
    [root@localhost ~]# echo $USER
    root
    [root@localhost ~]# [ $USER = "teacher" ] || echo "Not teacher"
    Not teacher
    8.10  只要“/etc/rc.d/rc.local”或者“/etc/init.d/rc.local”中有一个是文件,则显示“YES”,否则无任何输出。
    [root@localhost ~]# [ -f /etc/rc.d/rc.local ] || [ -f /etc/init.d/rc.local ] && echo "YES"
    YES
    8.11  测试“/etc/profile” 文件是否有可执行权限,若确实没有可执行权限,则提示“No x mode.”的信息。
    [root@localhost ~]# [ ! -x "/etc/profile" ] && echo "No x mode."
    No x mode.
    8.12  若当前的用户是root且使用的shell程序是“/bin/bash”, 则显示“YES”,否则无任何输出。
    [root@localhost ~]# echo $USER $SHELL
    root /bin/bash
    [root@localhost ~]# [ $USER = "root" ] && [ $SHELL = '/bin/bash' ] && echo "YES" 
    YES
    8.13  检查“/var/log/messages”文件是否存在,若存在则统计文件内容的行数并输出,否则不做任何操作(合理使用变量,可以提高编写效率)。
    [root@localhost ~]# vim chklog.sh
    #!/bin/bash
    LogFile="/var/log/messages"
    if [ -f $LogFile ] ;  then
        wc -l $LogFile
    fi
    [root@localhost ~]# sh chklog.sh 
    1005 /var/log/messages
    8.14  提示用户指定备份目录的路径,若目录已存在则显示提示信息后跳过,否则显示相应提示信息后创建该目录。
    [root@localhost ~]# vim mkbak.sh
    #!/bin/bash
    read -p "What is your backup directory: " BakDir
    if [ -d $BakDir ] ; then
    echo "$BakDir already exist. "
    else
        echo "$BakDir is not exist, will make it. "
        mkdir $BakDir
    fi
    [root@localhost ~]# sh mkbak.sh 
    What is your backup directory: /opt/bakroot
    /opt/bakroot is not exist, will make it. 
    [root@localhost ~]# ls -ld /opt/bakroot/
    drwxr-xr-x. 2 root root 4096 11?.17 19:30 /opt/bakroot/
    8.15 统计当前登录到系统中的用户数量,并判断是否超过三个,若是则显示实际数量并给出警告信息,否则列出登录的用户账号名称及所在终端。
    [root@localhost ~]# vim chkuser.sh
    #!/bin/bash
    UserNum=`who | wc -l`
    if [ $UserNum -gt 3 ] ; then
        echo "Alert, too many login users ( Total: $UserNum ). "
    else
        echo "Login users: "
        who | awk '{print $1,$2}'
    fi
    [root@localhost ~]# sh chkuser.sh 
    Login users: 
    root tty1
    root pts/0
    8.16  检查portmap进程是否已经存在,若已经存在则输出“portmap service if running.” ;否则检查是否存在“/etc/rc.d/init.d/portmap” 可执行脚本,存在则启动portmap服务,否则提示“no portmap script file.”。
    [root@localhost ~]# vim chkportmap.sh
    #!/bin/bash
    pgrep portmap &> /dev/null
    if [ $? -eq 0 ] ; then
        echo "portmap service is running. "
    elif [ -x "/etc/rc.d/init.d/portmap" ] ; then
         service portmap start
    else
        echo "no portmap script file. "
    fi
    [root@localhost ~]# sh chkportmap.sh 
    no portmap script file.
    8.17  每隔五分钟监测一次mysqld服务进程的运行状态,若发现mysqld进程已终止,则在“/var/log/messages”文件中追加写入日志信息(包括当时时间),并重启mysqld服务;否则不进行任何操作。
    [root@localhost ~]# vim chkportmap.sh
    #!/bin/bash
    service mysqld status &> /dev/null
    if [ $? -ne 0 ] ; then
       echo "At time: `date`: MySQL server is down. " >> /var/log/messages
       service mysqld restart
    fi
    [root@localhost ~]# sh chkportmap.sh
    [root@localhost ~]# tail -1 /var/log/messages
    At time: 2011 年 11 月 18 日 星期五 20:16:31 CST : MySQL server is down.
    [root@localhost ~]# crontab –e     //需确认crond服务已运行
    */5 * * * * /root/chkdbsvr.sh
    8.18  依次输出三条文字信息,包括一天中的“Moring”、“Noon”、“Evening”字串。
    [root@localhost ~]# vim showday.sh
    #!/bin/bash
    for TM in "Morning" "Noon" "Evening"
    do
        echo "The $TM of the day. "
    done
    [root@localhost ~]# sh showday.sh 
    The Morning of the day. 
    The Noon of the day. 
    The Evening of the day.
    8.19  对于使用“/bin/bash”作为登录shell的系统用户,检查他们在“/opt”目录中拥有的子目录或文件数量,如果超过100个,则列出具体数值及对应的用户账号。
    [root@localhost ~]# vim chkfileown.sh

    #!/bin/bash
    DIR="/opt"
    LMT=100
    ValidUsers=`grep "/bin/bash" /etc/passwd | cut -d ":" -f 1`
    for UserName in $ValidUsers
    do
       Num=`find $DIR -user $UserName | wc -l`
       if [ $Num -gt $LMT ] ; then
             echo "$UserName have $Num files. "
       fi
    done
    [root@localhost ~]# sh chkfileown.sh 
    [root@localhost ~]# find -user root | wc -l
    40
    8.20  计算“/etc”目录中所有“*.conf”形式的配置文件所占用的总空间大小。
    [root@localhost ~]# vim confsize.sh
    #!/bin/bash
    SizeNums=$(ls -l $(find /etc -type f -a -name *.conf) | awk '{print $5}')
    Total=0
    for i in $SizeNums
    do
        Total=`expr $Total + $i`
    done
    echo "Total size of conf files: $Total bytes. "
    [root@localhost ~]# sh confsize.sh 
    Total size of conf files: 813 bytes.
    8.21  由用户从键盘输入一个大于1的整数(如50),并计算从1到该数之间各整数的和。
    [root@localhost ~]# vim sumint.sh
    #!/bin/bash
    read -p "Input a number (>1): "  UP
    i=1
    sum=0
    while [ $i -le $UP ]
    do
        sum=`expr $sum + $i`
        i=`expr $i + 1`
    done
    echo "The sum of 1-$UP is : $sum"
    [root@localhost ~]# sh sumint.sh 
    Input a number (>1): 50
    The sum of 1-50 is : 1275
    8.22  批量添加20个系统用户账号,用户名称依次为“stu1”、“stu2”、“stu3”、……“stu20”,各用户的初始密码均设置为“123456”。
    [root@localhost ~]# vim add20users.sh
    #!/bin/bash
    i=1
    while [ $i -le 20 ]
    do
    useradd stu$i
    echo "123456" | passwd --stdin stu$i &> /dev/null
         i=`expr $i + 1`
    done
    [root@localhost ~]# sh add20users.sh
    [root@localhost ~]# tail -2 /etc/passwd
    stu19:541:541::/home/stu19:/bin/bash
    stu20:542:542::/home/stu20:/bin/bash
    8.23  编写一个批量删除用户的脚本程序,将上例中添加的20个用户删除。
    [root@localhost ~]# vim del20users.sh

    #!/bin/bash
    i=1
    while [ $i -le 20 ]
    do
          userdel -r stu$i
          i=`expr $i + 1`
    done
    [root@localhost ~]# sh del20users.sh
    [root@localhost ~]# grep "stu" /etc/passwd     //无输出则表示上述用户已删除
    8.24  由用户从键盘输入一个字符,并判断该字符是否为字母、数字或者其他字符,并输出相应的提示信息。
    [root@localhost ~]# vim hitkey.sh
    #!/bin/bash
    read -p "ress some key, then press Return: " KEY
    case "$KEY" in
       [a-z] | [A-Z])
            echo "It's a letter."
        ;;
    [0-9])
            echo "It's a digit."
        ;;
    *)
          echo "It's function keys,spacebar or other keys. "
    esac
    [root@localhost ~]# sh hitkey.sh 
    Press some key, then press Return: K
    It's a letter.
    [root@localhost ~]# sh hitkey.sh 
    Press some key, then press Return: 6
    It's a digit.
    [root@localhost ~]# sh hitkey.sh 
    Press some key, then press Return: ^[[19~   //按F8键
    It's function keys,spacebar or other keys.
    8.25  编写一个shell程序,计算多个整数值的和,需要计算的各个数值由用户在执行脚本时作为命令行参数给出。
    [root@localhost ~]# vim sumer.sh
    #!/bin/bash
    Result=0
    while [ $# -gt 0 ]
    do
        Result=`expr $Result + $1`
        shift
    done
    echo "The sum is : $Result"
    [root@localhost ~]# chmod a+x sumer.sh 
    [root@localhost ~]# ./sumer.sh 12 34
    The sum is : 46
    8.26  循环提示用户输入字符串,并将每次输入的内容保存到临时文件“/tmp/input.txt”中,当用户输入“END”字符串时退出循环体,并统计出input.txt文件中的行数、单词数、字节数等信息,统计完后删除临时文件。
    [root@localhost ~]# vim inputbrk.sh
    #!/bin/bash
    while true
    do
          read -p "Input a string: " STR
          echo $STR >> /tmp/input.txt
          if [ "$STR" = "END" ] ;  then
               break
          fi
    done
    wc /tmp/input.txt
    rm -f /tmp/input.txt
    [root@localhost ~]# sh inputbrk.sh 
    Input a string: wandogn
    Input a string: dongdonga
    Input a string: END
    3  3 22 /tmp/input.txt
    8.27  删除系统中的stu1~stu20各用户账号,但stu8、stu18除外。
    [root@localhost ~]# sh add20users.sh       //执行上面建立的脚本添加用户
    [root@localhost ~]# tail -2 /etc/passwd
    stu19:542:542::/home/stu19:/bin/bash
    stu20:543:543::/home/stu20:/bin/bash
    [root@localhost ~]# vim delsome.sh
    #!/bin/bash
    i=1
    while [ $i -le 20 ]
    do
        if [ $i -eq 8 ] || [ $i -eq 18 ] ; then
           let i++
           continue
        fi
        userdel -r stu$i
        let i++
    done
    [root@localhost ~]# sh delsome.sh 
    [root@localhost ~]# grep "stu" /etc/passwd
    stu8:531:531::/home/stu8:/bin/bash
    stu18:541:541::/home/stu18:/bin/bash
    8.28  在脚本中定义一个help函数,当用户输入的脚本参数不是“start”或“stop”时,加载该函数并给出关于命令用法的帮助信息,否则给出对应的提示信息。
    [root@localhost ~]# vim helpfun.sh

    #!/bin/bash
    help() {
          echo "Usage: "$0" start|stop"
    }
    case "$1" in
       start)
          echo "Starting ..."
         ;;
    *)
         help
    esac
    [root@localhost ~]# chmod a+x helpfun.sh
    [root@localhost ~]# ./helpfun.sh start
    Starting ...
    [root@localhost ~]# ./helpfun.sh restart
    Usage: ./helpfun.sh start|stop
    8.29  在脚本中定义一个加法函数,用于计算两个数的和,并调用该函数分别计算12+34、56+789的和。
    [root@localhost ~]# vim adderfun.sh
    #!/bin/bash
    adder() {
          echo `expr $1 + $2`
    }
    adder 12 34
    adder 56 789
    [root@localhost ~]# sh adderfun.sh 
    46
    845

  • 相关阅读:
    类加载机制深度解析
    Mysql索引数据结构详解(1)
    深入理解mysql锁与事务隔离级别
    关于redis HSCAN count参数不生效的问题
    在idea的java开发中字符串length()方法获取长度与赋值不符的问题
    在网页中使用超链接来打开本地应用(可传参数)
    断言(assert)简介
    9. Palindrome Number
    四、MapReduce
    三、HDFS——Hadoop分布式文件系统
  • 原文地址:https://www.cnblogs.com/sysk/p/4690572.html
Copyright © 2011-2022 走看看