设为首页 收藏本站
查看: 1248|回复: 0

shell脚本应用(四)

[复制链接]

尚未签到

发表于 2018-8-28 06:12:21 | 显示全部楼层 |阅读模式

  •   Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0是表示成功,否则(非0值)表示失败或者异常。使用专门的测试工具-test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0时表示条件成立);
  使用test测试命令时,包括以下两种形式。
  test  条件表达式
  或者
  [ 条件表达式 ]
  这两种方式的作用完全相同,但通常后一种形式更为常用,注意中括号括起来时至少要用一空格来分隔。
  文件测试:
  文件测试的常见选项如下:
  -d:测试是否为目录(Directory)
  -e:测试目录或文件是否存在(Exist)
  -f:测试是否为文件(File)
  -r:测试当前用户是否有权限读取(Read)
  -w:测试当前用户是否有权限写入(Write)
  -x:测试当前用户是否有权限执行(EXcute)
  执行条件测试后通过预定义变量“$?”可以获得测试命令的返回状态值。从而判断条件是否成立。
  例:执行下列操作可测试目录/media/cdrom是否存在,如果返回值$?为0,表示存在此目录否则则不存在,或虽然存在但不是目录。
[root@dbserver ~]# [ -d /media/cdrom ]  [root@dbserver ~]# echo $?    //查看当前一命令的返回值
  1                             //返回1表示条件不成立
  [root@dbserver ~]# [ -d /media ]
  [root@dbserver ~]# echo $?     //查看当前一命令的返回值
  0                                //返回0表示条件成立
  为了更直观的查看测试结果,可以结合命令输出符“&&”和echo命令一起使用,当条件成立时直接输出"yes",其中"&&"表示"而且"的关系,只有当前面的命令成功执行后才会执行后面的命令,否则后面的命令将会被忽略。例:上面的测试结果可以改为:
  [root@dbserver ~]# [ -d /media/cdrom ]  && echo "yes"  //无输出表示该目录不存在
  [root@dbserver ~]# [ -d /media ]  && echo "yes"       //输出"yes"表示该目录存在
  yes
  2.整数值得对比:整数值得比较指的是给定的两个整数值,判断第一个数与第二个数的关系,比如是否大于等于小于第二个数,整数值比较的常用选项如下。
  -eq:第一个数等于第二个数
  -ne:第一个数不等于第二个数
  -gt:第一个数大于第二个数
  -lt:第一个数小于第二个数
  -le:第一个数小于或等于第二个数
  -ge:第一个数大于等于第二个数
  例:当判断已经登陆的用户,当小于五个时输出"Too many",可以执行以下操作。
  [root@dbserver ~]# Unum=`who |wc -l`
  [root@dbserver ~]# [ $Unum  -lt 5 ]  && echo "Too many"
  Too many
  再举个例子,当内存大于1024MB时输出以下值:
  [root@dbserver ~]# FreeCC=$(free -m  | grep "cache:"  | awk  '{print $ 4}')
  [root@dbserver ~]# [ $FreeCC -gt 1024 ] && echo ${FreeCC}MB
  1648MB
  4.字符串比较:字符串比较通常用于检查用户的输入,系统环境等是否满足条件;
  =:第一个字符串与第二个字符串相同;
  !=:第一个字符串与第二个字符串不同,其中!表示取反;
  -z:检查字符串是否为空值;
  例:判断当前的语言环境是否为zh.CN;
  [root@dbserver ~]# echo $LANG
  en_US.UTF-8
  [root@dbserver ~]# [ $LANG != "zh_CN" ]  && echo "not zh.CN"
  not zh.CN
  再例如,在Shell脚本应用中,经常输入yes或者no来确认某个任务,以下操作展示了确认交互的简单过程:
  [root@dbserver ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
  是否覆盖现有文件(yes/no)?yes
  [root@dbserver ~]# [ $ACK = "yes" ] && echo “覆盖”
  “覆盖”
  [root@dbserver ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
  是否覆盖现有文件(yes/no)?no
  [root@dbserver ~]# [ $ACK = "no" ] && echo 不覆盖
  不覆盖
  4.逻辑测试:指的是判断两个或多个条件之间的依赖关系,当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或者其中一个成立等情况,需要一个测试的过程,常用的逻辑测试操作如下;
  &&:逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为0(结果成立);
  ||:逻辑或,表示“或者”,只要当指定的条件不成立时,整个测试的返回值才为0(结果成立),使用test命令测试时,||可改为"-o";
  !:逻辑否,表示“不”,只有当条件不成立时,整个测试命令的返回值为0(但结果是成立的);
  例:若要判断当前Linux系统内核版本是否大于2.4,可执行以下操作;
  [root@dbserver ~]# uname -r
  2.6.32-431.el6.x86_64
  [root@dbserver ~]# Mnum=$(uname -r| awk -F. '{print $1}')
  [root@dbserver ~]# Snum=$(uname -r| awk -F. '{print $2}')
  [root@dbserver ~]# [ $Mnum -eq 2 ] && [ $Snum -gt 4 ]   && echo "符合要求"
  符合要求
  下次写点if语句,我这都是基础的,慢慢写点难度大的,我就是个渣渣,哈哈


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-557395-1-1.html 上篇帖子: 关于shell脚本的一些容易混淆的概念 下篇帖子: 【DAY3】shell编程以及linux的其他设置学习笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表