编写shell管理脚本(二)

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

8.6  提示用户输入一个文件路径,并判断是否是“/etc/inittab”,如果是则显示“YES”。
[[email protected] ~]# df -hT | grep "/boot" | awk ‘{print $6}‘
[[email protected] ~]# read -p "Localtion: " FilePath 
Localtion: /etc/inittab   
[[email protected] ~]# [ $FilePath = "/etc/inittab" ] && echo "YES"
YES
8.7  若当前环境变量LANG的内容不是“en.US”,则输出LANG变量的值,否则无输出。
[[email protected] ~]# [ $LANG != "en.US" ] && echo $LANG
zh_CN.UTF-8
8.8  使用touch命令建立一个新文件,测试其内容是否为空,向文件中写入内容后,再次进行测试。
[[email protected] ~]# touch zero.file
[[email protected] ~]# [ -z ‘cat zero.file‘ ] && echo "YES"
YES                                      //表示该文件为空文件
[[email protected] ~]# [ -z ‘cat zero.file‘ ] && echo "YES"
[[email protected] ~]# echo "something" > zero.file
[[email protected] ~]# [ -z ‘cat zero.file‘ ] && echo "YES"
                                         //无输出表示文件不为空
8.9  测试当前的用户是否是teacher,若不是则提示“Not teacher”。
[[email protected] ~]# echo $USER
root
[[email protected] ~]# [ $USER = "teacher" ] || echo "Not teacher"
Not teacher
8.10  只要“/etc/rc.d/rc.local”或者“/etc/init.d/rc.local”中有一个是文件,则显示“YES”,否则无任何输出。
[[email protected] ~]# [ -f /etc/rc.d/rc.local ] || [ -f /etc/init.d/rc.local ] && echo "YES"
YES
8.11  测试“/etc/profile” 文件是否有可执行权限,若确实没有可执行权限,则提示“No x mode.”的信息。
[[email protected] ~]# [ ! -x "/etc/profile" ] && echo "No x mode."
No x mode.
8.12  若当前的用户是root且使用的shell程序是“/bin/bash”, 则显示“YES”,否则无任何输出。
[[email protected] ~]# echo $USER $SHELL
root /bin/bash
[[email protected] ~]# [ $USER = "root" ] && [ $SHELL = ‘/bin/bash‘ ] && echo "YES" 
YES
8.13  检查“/var/log/messages”文件是否存在,若存在则统计文件内容的行数并输出,否则不做任何操作(合理使用变量,可以提高编写效率)。
[[email protected] ~]# vim chklog.sh
#!/bin/bash
LogFile="/var/log/messages"
if [ -f $LogFile ] ;  then
    wc -l $LogFile
fi
[[email protected] ~]# sh chklog.sh 
1005 /var/log/messages
8.14  提示用户指定备份目录的路径,若目录已存在则显示提示信息后跳过,否则显示相应提示信息后创建该目录。
[[email protected] ~]# 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
[[email protected] ~]# sh mkbak.sh 
What is your backup directory: /opt/bakroot
/opt/bakroot is not exist, will make it. 
[[email protected] ~]# ls -ld /opt/bakroot/
drwxr-xr-x. 2 root root 4096 11?.17 19:30 /opt/bakroot/
8.15 统计当前登录到系统中的用户数量,并判断是否超过三个,若是则显示实际数量并给出警告信息,否则列出登录的用户账号名称及所在终端。
[[email protected] ~]# 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
[[email protected] ~]# 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.”。
[[email protected] ~]# 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
[[email protected] ~]# sh chkportmap.sh 
no portmap script file.
8.17  每隔五分钟监测一次mysqld服务进程的运行状态,若发现mysqld进程已终止,则在“/var/log/messages”文件中追加写入日志信息(包括当时时间),并重启mysqld服务;否则不进行任何操作。
[[email protected] ~]# 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
[[email protected] ~]# sh chkportmap.sh
[[email protected] ~]# tail -1 /var/log/messages
At time: 2011 年 11 月 18 日 星期五 20:16:31 CST : MySQL server is down.
[[email protected] ~]# crontab –e     //需确认crond服务已运行
*/5 * * * * /root/chkdbsvr.sh
8.18  依次输出三条文字信息,包括一天中的“Moring”、“Noon”、“Evening”字串。
[[email protected] ~]# vim showday.sh
#!/bin/bash
for TM in "Morning" "Noon" "Evening"
do
    echo "The $TM of the day. "
done
[[email protected] ~]# 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个,则列出具体数值及对应的用户账号。
[[email protected] ~]# 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
[[email protected] ~]# sh chkfileown.sh 
[[email protected] ~]# find -user root | wc -l
40
8.20  计算“/etc”目录中所有“*.conf”形式的配置文件所占用的总空间大小。
[[email protected] ~]# 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. "
[[email protected] ~]# sh confsize.sh 
Total size of conf files: 813 bytes.
8.21  由用户从键盘输入一个大于1的整数(如50),并计算从1到该数之间各整数的和。
[[email protected] ~]# 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"
[[email protected] ~]# sh sumint.sh 
Input a number (>1): 50
The sum of 1-50 is : 1275
8.22  批量添加20个系统用户账号,用户名称依次为“stu1”、“stu2”、“stu3”、……“stu20”,各用户的初始密码均设置为“123456”。
[[email protected] ~]# 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
[[email protected] ~]# sh add20users.sh
[[email protected] ~]# tail -2 /etc/passwd
stu19:541:541::/home/stu19:/bin/bash
stu20:542:542::/home/stu20:/bin/bash
8.23  编写一个批量删除用户的脚本程序,将上例中添加的20个用户删除。
[[email protected] ~]# vim del20users.sh

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

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

时间: 2024-10-12 21:29:39

编写shell管理脚本(二)的相关文章

编写shell管理脚本(一)

7.1  查看当前linux系统中能够使用的shell程序的列表[[email protected] ~]# cat /etc/shells/bin/sh/bin/bash/sbin/nologin/bin/tcsh/bin/csh/bin/ksh7.2  确认shell程序中存在的部分链接文件[[email protected] ~]# ls -l /bin/*sh-rwxr-xr-x 1 root root 735004 2008-10-21 /bin/bashlrwxrwxrwx 1 ro

shell脚本的使用---if变量编写lamp管理脚本

注意实际操作时需根据实际情况对脚本做相应调整 1.安装httpd vi apache_install.sh #!/bin/bash rpm -e httpd httpd-manual --nodeps ls /root/httpd* if [ $? -eq 0 ];then  ##判断是否已经下载了httpd tar zxvf /root/httpd-2.2.17.tar.gz -C /usr/src/ cd /usr/src/httpd-2.2.17/ ./configure --prefix

小鸟初学Shell编程(二)编写简单的Shell脚本

Shell脚本 编写Python.PHP脚本通常需要掌握语言的函数,那么Shell脚本则不需要,只需要掌握Linux命令就可以编写Shell脚本,因为Shell脚本就是由多个Linux命令组成,通过将多个Linux命令组合保存成一个脚本文件,可直接给其他人使用. 组合命令 进入一个目录,查看目录的文件,这个过程分别需要执行两条命令,分别是cd 和ls. 分开执行两个命令的形式如下: [[email protected] usr]# cd /usr/ [[email protected] usr]

linux软件管理之------编译安装nginx服务器并手动编写自动化运行脚本

红帽系列的 linux软件管理分为三类:1. rpm 安装软件.2. yum 安装软件.3. 源码包编译安装.前面两种会在相关专题给出详细讲解.源码包的编译安装是非常关键的,我们知道linux的相关版本非常多,相关的编译器,解释器也有很多,很多还有最小系统,嵌入式系统等等.同一功能的软件如果只有编译好的软件包,在其它linux的平台上,可能并不能正常安装运行,在此情况下,源码包编译安装出现了.所以本文的重点是以nginx为例,给出源码包编译安装的详细过程,同时带你手工编写自动化运行脚本. 准备工

shell脚本二

在shell脚本一 中,我讨论了shell脚本的语法规范,shell脚本的变量,以及shell脚本的测试语句. 仅仅懂得这些只能写简单的脚本,在简单的脚本中各条语句按顺序执行,从而实现自动化的管理,顺序单一执行太过机械化,不够“智能”,难以实现更加灵活的系统任务.甚至一个简单的场景:现有100台linux服务器,其中有50台安装过某软件,有50台没有安装过某软件.如果没有流程控制及循环方面的脚本知识,如此简单的问题,也变得非常低效.所以本文带你走进shell脚本的流程控制及循环的世界.  一.多

Linux系统编写shell脚本批量创建和删除用户

一.编写shell脚本批量添加用户 实现方法:判断用户是否存在,存在则返回错误提示,同时判断用户文件是否存在,不存在则退出 1.创建添加用户脚本 [[email protected] ~]# vim useradd.sh #!/bin/bashif [ $# -eq 0 ];then        echo "你没有输入任何文件!"        exit 1fi if [ ! -f $1 ];then        echo "输入有误!"        exit

看我如何利用Shell编写vsftpd管理软件

今天弄服务器的时候无意间用到此脚本,觉得当时写的虽然不咋样,但还是有点借鉴意义,就拿出来给大家看看.希望大家喜欢 先看看演示视频 看我如何利用Shell编写vsftpd管理软件 高清版下载: 百度云下载 OK然后我们来看看脚本的实现过程,时间有点久了当时的想法可能现在有点想不起来了,解释的不对的地方望见谅 脚本分为7个部分,这里我只做简单的解释 第一部分 脚本开始就利用awk提取日志中的用户名字段保存到tmp目录下的ftplog-userlist.txt文件中,方便后面查询 然后开始信息的展示,

为程序编写Service服务管理脚本

SaltStack通过Service方式管理服务,对于通用的服务,如mysql.apache.php等,自带service服务管理脚本,SaltStack可以方便管理.但是对于一些公司自有的服务,可能这些服务在开发之初,并没有考虑日后会采用Service脚本进行服务管理,为了统一Salt对服务的管理,我采用的方式是为每一个程序编写Service脚本. 这里主要注意以下两个问题: 1.这里有部分机器的优化,放在/etc/profile和/root/.bashrc中,而这两个文件在用户登陆的时候,会

工程师技术(五):Shell脚本的编写及测试、重定向输出的应用、使用特殊变量、编写一个判断脚本、编写一个批量添加用户脚本

一.Shell脚本的编写及测 目标: 本例要求两个简单的Shell脚本程序,任务目标如下: 1> 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话"Hello World!!"   2> 编写一个能输出系统信息的 /root/sysinfo 脚本,执行后依次输出当前红帽系统的版本信息.当前使用的内核版本.当前系统的主机名 方案: 规范Shell脚本的一般组成: 1> #! 环境声明(Sha-Bang)    2> # 注释文本