Linux运维---shell脚本练习串烧1

脚本说明
1.脚本1:解决重装大量的库文件
2.脚本2:选择并切换到想要切换的工作目录

脚本1说明:

某位员工的centos7主机系统出现如下问题:

执行ldconfig命令时报如下错误:库文件是空的,长度为0,需要重装这些库文件。
ldconfig: File /lib/libstdc++.so.6 is empty, not checked.
ldconfig: File /lib/libstdc++.so.6.0.19 is empty, not checked.
ldconfig: File /lib/libaudit.so.1 is empty, not checked.
ldconfig: File /lib/libaudit.so.1.0.0 is empty, not checked.
ldconfig: File /lib/libauparse.so.0 is empty, not checked.
ldconfig: File /lib/libauparse.so.0.0.0 is empty, not checked.
ldconfig: File /lib/libdw-0.172.so is empty, not checked.
ldconfig: File /lib/liblz4.so.1 is empty, not checked.
ldconfig: File /lib/libelf-0.172.so is empty, not checked.
ldconfig: File /lib/libasm-0.172.so is empty, not checked.
ldconfig: File /lib/liblz4.so.1.7.5 is empty, not checked.
ldconfig: File /lib64/libXfont.so.1 is empty, not checked.
ldconfig: File /lib64/libXfont.so.1.4.1 is empty, not checked.
ldconfig: File /lib64/libical.so.1 is empty, not checked.
ldconfig: File /lib64/libical.so.1.0.1 is empty, not checked.
ldconfig: File /lib64/libicalss.so.1 is empty, not checked.
ldconfig: File /lib64/libicalss.so.1.0.1 is empty, not checked.
ldconfig: File /lib64/libicalvcal.so.1 is empty, not checked.
ldconfig: File /lib64/libicalvcal.so.1.0.1 is empty, not checked.
ldconfig: File /lib64/libminizip.so.1 is empty, not checked.
ldconfig: File /lib64/libminizip.so.1.0.0 is empty, not checked.
ldconfig: File /lib64/libgit2-glib-1.0.so.0 is empty, not checked.
ldconfig: File /lib64/libgit2-glib-1.0.so.0.2600.4 is empty, not checked.
ldconfig: File /lib64/libopenconnect.so.5.4.0 is empty, not checked.
ldconfig: File /lib64/libnghttp2.so.14.16.1 is empty, not checked.
.............省略

如上所示:需要重装这些库文件,不过并不是每行信息显示的都是库文件,有的行是软链接文件,因为链接的库文件为空,所以软链接文件也为空。

脚本1思路
1.首先需要截取出库文件的完整路径和名称,比如(/lib64/libical.so)这样。
2.通过rpm -qf 库文件名能够查出该库文件属于哪个软件包,重装该软件包即可。
3.需要针对软链接文件做判断,如果是链接文件,就不执行重装命令。
4.使用循环去遍历库文件列表,这里使用的是while循环。

脚本1内容

#/bin/bash
LDCONFIG=`ldconfig 2>&1|sort|awk ‘{print $3}‘`        #截取出库文件名称,因为ldconfig命令输出的是错误输出消息,所以这里用2>&1将错误输出重定向到标准输出,管道后的命令才能接受信息。

echo "$LDCONFIG" |           #这里用管道这种方式让while循环处理库文件列表,注意加上双引号
while read line                      #while read line 经典组合
 do
   if [ `ls -l $line | grep -c ‘^l‘` -ne 0 ]         #判断文件是否是链接文件,grep -c 统计匹配串出现的次数,如果是链接文件,grep -c ‘^l‘ 就是1,1不等于0成立,执行continue语句,跳出当前循环
     then
         continue
   else
         PACKAGE=`rpm -qf $line`             #如果是库文件,那么查询该库文件属于哪个包
         if [ `echo "$PACKAGE" | wc -l` -eq 1 ]   #判断库文件属于的包是否只有一个,如果只有一个,就重装该包
           then
                echo "prepare reinstall $PACKAGE"
                yes | yum reinstall $PACKAGE        #yes命令如果不跟参数,就会一直输出y,为什么不使用yum -y install? 因为无聊
                [ $? -eq 0 ] && echo "$PACKAGE reinstall succes" || echo "$PACKAGE reinstall failed"
           else
                echo ‘I don not know need reinstall which PACKAGE‘
         fi
   fi
 done

脚本1小结
该脚本没有针对日志信息,以及安装出错等其他信息的记录,简单的满足重装大量库文件,不能重装的库文件单独解决即可。

脚本2说明

工作中经常频繁的切换到某些目录,刚好看书看到pushd、popd、dirs等命令的介绍,就想写个利用这些命令来切换目录的脚本,该脚本用到的命令说明:

1.pushd命令:shell内置命令,pushd命令带上目录名作为参数的使用可以将该目录添加到目录栈中。如果参数是+n(这里n是一个数字),pushd将旋转栈,从最左边开始栈中的第n个目录将被放到栈顶,同时切换到该目录。..........(内容来自Unix shell范例精解第四版)

2.popd命令:shell内置命令,popd命令从栈顶删除一个目录并切换到那个目录。............(内容来自Unix shell范例精解第四版)

3.dirs命令:带-l选项的内置命令dirs,将以完全路径名的格式显示目录栈中的所有目录。...........(内容来自Unix shell范例精解第四版)

脚本2思路

1.使用select制作目录菜单,选择哪个目录就切换到该目录
2.需要用pushd将目录加入目录栈,用popd命令将目录从目录栈中弹出
3.需要用dirs命令例出目录栈中的目录以及目录的编号

脚本2内容

这是写到/etc/profile文件中的一个函数,刚开始单独写成脚本文件然后执行脚本,发现并没有切换目录,应该是执行脚本时产生了新的进程,所以在当前进程并没有切换目录,后面就没有继续测试脚本了,就将它写成函数放到/etc/profile文件里,内容如下:

function cdir ()       #函数名称cdir
{
DIRS="                  #该变量存放目录列表
/home/kevin.tao/git-server/puppet/modules/nagios/files/client/centos7
/home/kevin.tao/git-server/puppet/modules/nagios/files/server/objects
/home/kevin.tao/git-server/puppet/modules/db_backup
/home/kevin.tao/git-server/puppet/manifests
/home/kevin.tao/Desktop"
set $DIRS             #set 命令可以给位置参数重新赋值,这里就把目录名变成$1 $2 $3 $4 ........
while popd ; do : ; done &>/dev/null    #while循环条件是popd命令,将目录栈清空,如果不清空,每执行一次函数,就会重复添加目录到目录栈中,这样就不对了
until [ -z $1 ]          #until循环用来将目录添加到目录栈中,注意shift命令
do
   pushd $1 &>/dev/null
   shift
done
PUSH=`dirs -l -v|sed ‘$d‘|sed ‘s/ //g‘`    #PUSH变量用来存放目录栈中的目录列表以及目录编号(n)
PS3="Please choose directory"
select DIR in $PUSH                            #select菜单,选择要切换的目录
do
    NUM=${DIR%%/*}               #选择了哪个目录,这里就会将该目录在栈中的目录编号截取出来
    pushd +$NUM &>/dev/null       #pushd命令加上目录编号就能切换到该目录
    break
done
}

export -f cdir

脚本2执行

[[email protected] ~]$ cdir
1) 0/home/kevin.tao/Desktop
2) 1/home/kevin.tao/git-server/puppet/manifests
3) 2/home/kevin.tao/git-server/puppet/modules/db_backup
4) 3/home/kevin.tao/git-server/puppet/modules/nagios/files/server/objects
5) 4/home/kevin.tao/git-server/puppet/modules/nagios/files/client/centos7
Please choose directory2
[[email protected] manifests]$     #成功切换到选择的目录

脚本2小结

写脚本的时候会遇到很多问题,需要慢慢去修补漏洞。刚开始以为不需要用到popd命令,后面发现目录栈中重复目录太多,只能一个个目录弹出。如果使用cd命令估计就会容易得多,但是没有试过,想多尝试一些不同的方法、不同的技巧,这样更能提升shell编程的能力。

原文地址:https://blog.51cto.com/pkimin3/2433649

时间: 2024-11-02 16:43:17

Linux运维---shell脚本练习串烧1的相关文章

提供跟老男孩学Linux运维Shell编程实战的第四、第五章源代码

第四章是讲Shell变量知识进阶与实践: 第五章是讲变量的数值计算实践: 附件中包括源码,请下载. 该两章在学习时要注意相关事项: 1.注意标点符号的使用:例如,单引号,反引号,双引号等: 2.注意该要留空格的留空格: 3.注意特殊变量的作用: 4.内置变量的使用: 5.算术运算任的使用.

<zz>linux运维自动化shell脚本小工具

from http://www.cnblogs.com/wang-li/p/5728461.html linux运维shell 脚本小工具,如要分享此文章,请注明文章出处,以下脚本仅供参考,若放置在服务器上出错,后果请自负 1.检测cpu剩余百分比 #!/bin/bash #Inspect CPU #Sun Jul 31 17:25:41 CST 2016 PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/hom

linux运维自动化shell脚本小工具

linux运维shell 脚本小工具,如要分享此文章,请注明文章出处,以下脚本仅供参考,若放置在服务器上出错,后果请自负 1.检测cpu剩余百分比 #!/bin/bash #Inspect CPU #Sun Jul 31 17:25:41 CST 2016 PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/wl/bin export PATH TERM=linux export TERM CpuResu

《跟老男孩学Linux运维之shell编程实战》-第五章 shell脚本的条件测试

本文的知识点是关于shell脚本的条件测试的相关内容. 通常在shell脚本中我们需要做各式各样的条件判断,比如,测试一个文件是否存在.是否为文件或目录.是否 具有执行权限等等,所以在shell脚本中,条件判断还是至关重要的.接下来我们进入正题:shell脚本的条件测试. 1.在bash编程中,条件测试常用的语法形式如下表: 提示: 语法1中的test命令和语法2中的[]是等价的.语法3中的[[]]双中括号为扩展的test命令. 语法4中的(())常用于计算. 在双中括号[[]]中可以使用通配符

Linux运维系统工程师系列之shell脚本一则小随笔

shell随笔 一.   学好shell编程的知识储备 前面讲过,给大家留作业Linux系统命令应用: Vi/vim 编辑器的熟练使用,SSH客户端软件的设置: 基础的服务,系统服务ntp,crond,网络服务:nfs,rsync,inotify,sersync,ssh,lanmp. 补充:清空日志的三种方法: echo  " " > filename.log >filename.log cat  /dev/null > filename.log 注:工作中有的时候不

《跟老男孩学Linux运维之shell编程实战》-第一章 shell脚本初步入门

本文是在学习<跟老男孩学Linux运维之shell编程实战>这本书时记录的知识点.看了这本书,我受益匪浅,当然这仅是我个人观点.下面我们言归正传,开始了解一下shell脚本吧! shell本身是一个命令解释器,它的作用是解释执行用户输入的命令及程序等. shell脚本语言的种类:sh.ksh.bash.csh.tcsh,Linux中主流的shell是bash,所以本文及后续shell脚本以bash为主. 那我们如何查看Linux系统中默认的shell? [[email protected] ~

面试linux运维一定会问到Shell脚本这24个问题

面试linux运维一定会问到Shell脚本这24个问题 虽然现在Python在运维工作中已经使用很普遍,但是很多企业在找Linux云计算工程师的时候还是会问到 shell 脚本的问题,它有助于你在工作环境中自动完成很多任务. 如下是一些面试过程中,经常会遇到的 shell 脚本面试问题及解答: Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Sh

Linux运维 第二阶段 (九)shell编程

Linux运维 第二阶段 (九)shell编程 一.1.基础正则表达式: *         前一个字符匹配0次或任意多次 .         匹配除了换行符外任意一个字符 ^         匹配行首,例:^Hello,匹配以Hello开头的行 $         匹配行尾,例:Hello$匹配以Hello结尾的行 []        中括号中指定的一个字符,例:[0-9].[a-z] [^]       匹配中括号字符以外的任意一个字符,例:[^0-9].[^a-z] \         转

Linux运维 第二阶段 (八)shell基础

Linux运维第二阶段(八)shell基础 一.shell的两种主要语法:Bourne家族(sh/ksh/bash/psh/zsh);C家族(csh/tcsh). 注:bash和zsh在不同程度上支持csh的语法. #vi  /etc/shells                 (可查询linux支持的shell) 二.1.#echo  -e|-n  输出内容 -e      可支持反斜线\控制的字符转换(\\,\a,\b,\c,\e,\f\,\n,\r,\t,\v,\0mmm,\xhh) -