Shell-case:脚本中在yum安装软件包前如何对环境进行检测

      最近一直忙于学习Linux的知识,写了不少东西都是自己当天学的Linux知识,还有一些自己当天的知识总结,已经很久没有写过正儿八经写写自己研究分析出来的算法,这个国庆节没什么事做,就一些具体的需求,做了点研究,结合学过的shell脚本的知识,做了几个脚本case,通过一些算法,巧妙的实现了需求,这几个专题blog和大家分享一下。

      学Linux的道友对于yum应该是非常的熟悉,他能实现装包自动解决依赖,在很多安装脚本中需要用yum来安装一些编译安装的依赖包,那么如何判断yum是否能用,不能用报错退出,能用就进行安装依赖包,不过也可能安装失败,如果失败了也要报错退出,这就形成了多分支的一个判断,通过常见的shell脚本编写方法,就是if-elif-else-fi这个模式来实现,不过这就比较冗长,以后想把代码移植到其他代码中,显得太臃肿,不精简,今天我试着通过逻辑与和或来实现,不过里面也有不少问题,当然有问题解决了就好了,那下面我就和大家分享一下我的算法,话不多说,先上成品,大家可以直接套用

# 检测yum是否可用
[ $(yum repolist | awk '/repolist/{print$2}' | sed 's/,//') -eq 0 ] && echo 'your yum has problem' && exit 2

# 如果只要安装一个包直接执行:
# yum install -y 需要安装的包 &>/dev/null
# [ $? -ne 0 ] && echo 'your yum cannot install '$i && exit 3

# 如果安装多个包,就用一个循环:
for i in 需要yum安装的多个rpm包名,空格分隔
do
  rpm -qa | grep ${i%%.*} &>/dev/null
  [ $? -eq 0 ] || yum install -y $i&>/dev/null
  [ $? -ne 0 ] && echo 'your yum cannot install '$i && yum_right=3
done
[ $yum_right ] && exit 3

      那下面我就带大家一起分析一下这个代码

      先解决第一个需求,判断yum源是否可用,想代码前,我们先想想,我们人是如何判断yum是否可用,我们是使用命令:yum repolist ,看他最后一行那里显示yum中有多少个包,如果显示0个,那yum一定是不能用的,如果不是,那至少说明yum可用安装一些包,哪怕只有一个包,我们也可以暂且把yum当做是可以用的,至于能不能安装我们的包,我们都到后面再做判断,那这样我们就可以吧问题抽象化了:判断yum源是否可用==>判断yum repolist命令中的包数是否为0。
那如何提取想要的数字部分,然后把它进行比较呢,很简单,用awk检索,不过awk只能检索文本内容,那我们用管道传递即可。
      yum repolist 命令输出是:

[root@Lyu ~]# yum repolist
已加载插件:fastestmirror
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Determining fastest mirrors
源标识                                 源名称                              状态
!rhel7                                rhel7                               9,911
repolist: 9,911

      其中提供包数的那行是repolist后面跟的数字,那就awk配合正则表达式,把这第二列的数字过滤出来,其具体操作下来就是

$(yum repolist | awk '/repolist/{print$2}')

      这样,这个命令输出就是 9,911  ,不过也可能只有数字,没有逗号,这时候,我们就要想办法把这个,过滤出来,如果有就将其去掉,那就用到sed命令,进行文本替换,通让sed是一个文本编译器,我们就也要用管道进行连接数据,最后就得到这个语句

$(yum repolist | awk '/repolist/{print$2}' | sed 's/,//')

      只需要判断这个数值是否等于0,那就用到数值大小比较,等于就是-eq,如果是0,那我们就需要进行输出告知用户yum有问题,然后exit设置退出值,而逻辑判断如果要进行两次连接,且第二次的echo命令一定为真,那如果想让第三个命令的执行与否于第一个命名的成败相关联,只能用&&连接,如果用||,第二个命令一定为真,导致第三个命令一定会执行,所以,大家可以这么急,如果以第一个命令执行对错进行划分,根据其成功或者失败来执行后面两个命令的执行与否,我们就用&&相连,如果是前面为真的时候执行,那正好,如果是前面命令结果为假就想办法(用!将命令成功与否进行置反)把然后进行连接。
最后,我们判断yum源是否有问题就是一条命令,如果失败就退出返回值2,如果没问题,就继续脚本

[ $(yum repolist | awk '/repolist/{print$2}' | sed 's/,//') -eq 0 ] && echo 'your yum has problem' && exit 2

      这样就算解决了yum源能否用的问题,下面考虑有yum源但是能否安装的问题,这时候有个问题也应运而生,在考虑安装前,我们应该先考虑一下有没有安装过,如果安装过了,那我们也就不需要安装了,那能不能装也就没什么关系了,这样,我们就要根据软件包名来检索,软件有没有安装,那么我们要检查一个软件名的方法就是 rpm -qa | grep 软件名,如果返回值是0就是安装了,否则就是没有安装,那么我们要做的就是把软件名从软件包名中取出,这个并不通用,因为一些软件其软件名并不会卸载软件包名中,所以,有的时候这个命令并不能检查成功,不过好在,如果安装过了,用yum安装会自己报错,所以不用太刻意的执着这个问题,稍作判断即可,然后就是多个软件包,如何进行判断安装,这就需要用循环,shell中的循环,是for循环中定义 变量 依次从后面的值中取值,直到取完为止,所以用for循环可以解决多个包的问题。
      当然有些道友觉得没必要判断,反正yum安装的时候回判断,如果不需要判断,可以不用循环,直接yum后面接多个包名,不过做判断会使得容错性变强,有的时候,我们安装rpm包不一定是用yum仓库中的rpm包,有的时候是网上下载的rpm包,如果客户用非yum仓库的包装了这个包,不检查就导致yum会直接从仓库中找这个软件,但是找不到按照逻辑就报错,但事实上已经装了,就没必要再yum安装,这样显得兼容性和容错性不强。

for i in 需要yum安装的多个rpm包名,空格分隔
do
  rpm -qa | grep ${i%%.*} &>/dev/null
  [ $? -ne 0 ] && yum install -y $i &>/dev/null
done

      现在已经做到,如果没有依赖的软件包,就yum安装,如果有就不操作,下面问题又出现了,如果没有软件包,yum安装了,但是yum安装失败了,这就需要再判断,这时候大家就会想用多分支,进行判断,多分支进行处理,然后就会一个命令,然后执行,然后判断,导致 if 的一个分支中套用一个 if 判断,显得很臃肿,那这时候,我想简化,就进行了逻辑分析,当第一个查找命令不成功的时候,执行第二个命令的yum安装,这时候如果yum成功那么第二个命令成功,如果第一个命令查找成功,执行执行第二个命令判断,这时候判断为真,就不执行install,但返回值为假,那如果我用逻辑或,只要一个为真即为真,那不就合并了逻辑真假,只需要判断第二个命令的正确与否即可判断前面两个命令成功与否了。

for i in 需要yum安装的多个rpm包名,空格分隔
do
  rpm -qa | grep ${i%%.*} &>/dev/null
  [ $? -eq 0 ] || yum install -y $i&>/dev/null
  [ $? -ne 0 ] && echo 'your yum cannot install '$i
done

      这时候功能基本完成,还有一个问题,就是程序出错的时候要返回报错,但是我们又不能直接在循环中的第三个命令后,进行判断退出,因为如果一个包不能安装就报错退出,就导致,用户解决了一个,执行又报错,这样体验很不好,我们应该不管能不能安装,都要全部判断完,然后只要有一个不能装就报错退出,有多个就一并报出,方便用户一次处理,这时候,我们只需要用一个变量,如果有不能安装的包,就立刻在屏幕中显示,然后给这个变量赋值,但不退出,而是继续循环,在循环结束后,只需要判断变量有没有值,如果有说明至少有一个包不能装,这时候用exit返回报错。

for i in 需要yum安装的多个rpm包名(空格分隔)
do
  rpm -qa | grep ${i%%.*} &>/dev/null
  [ $? -eq 0 ] || yum install -y $i&>/dev/null
  [ $? -ne 0 ] && echo 'your yum cannot install '$i && yum_right=3
done
[ $yum_right ] && exit 3

      这样就完整的完成了所有代码,完成的检索了yum的可用性,并完成软件包的安装,如果有什么考虑不周的,希望各位大佬不吝赐教

附:下面还有几篇shell具体需求的case脚本,可复用性强,只需要把中文部分按照要求进行替换即可,还要注意一下一些变量,不要出现重复即可,如果喜欢可以收藏转发,但请注明出处,谢谢。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值