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内容 #/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内容 这是写到/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编程的能力。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |