Shell脚本条件语句与if语句的使用

一、条件测试

  • 如果要使得Shell脚本程序具备一定的“智能”,第一个问题便是如何区分不同的情况以执行何种操作
  • Shell环境根据命令执行后的返回值状态($?)来判断是否执行成功,当返回值为0时表示成功,否则非0值表示失败。

1.1 test命令

  • 可以对特定的条件表达进行测试,,返回值为0表示成立。
基本格式:
 test   条件表达式
 [ 条件表达式 ]
  • 这两条作用完全相同,后一种更常用更贴近编程习惯。注: 后一种方括号与条件表达式之间至少一个空格进行分隔。

1.1.1 文件测试

  • 根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等
  • 常见操作选项
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exit)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试是否设置有可执行(Excute)权限

例:

[root@localhost ~]# [ -d /dev/sr0 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -e /dev/sr0 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -e /dev/cdrom ]&& echo "YES"       ## 文件是否为目录,是的话输出YES
YES

1.1.2 文件之间判断

  • 两个文件的比较,常用的选项有:
-nt:判断文件A是否比文件B新
-ot:判断文件A是否比文件B旧
-ef:判断两个文件是否为同一个文件,用来判断两个文件是否指向同一个inode

例:

[root@localhost ~]# touch a
[root@localhost ~]# touch b
[root@localhost ~]# [ a -ot b ]&& echo "YES" || echo "NO"   ## a是否比b文件旧
YES
[root@localhost ~]# [ a -nt b ]&& echo "YES" || echo "NO"  ## a是否比b文件新
NO
[root@localhost ~]# ln a c  ## 创建a文件的硬连接c
[root@localhost ~]# [ a -ef c ]&& echo "YES" || echo "NO"  
YES                ## 指向同一个inode

二 、整数值比较

  • 根据给定的两个整数值,判断第一个数与第二个数的关系,如 是否大于、等于、小于第二个数。
  • 常用选项如下:
-eq: 第一个数等于(Equal)第二个数
-ne:第一个数不等于(Not Equal)第二个数
-gt:第一个大于(Greater Than)第二个数
-lt:第一个数小于(Lesser Than)第二个数
-le:第一个数小于或等于(Lesser or Equal)第二个数
-ge:第一个数大于或等于(Greater or Equal)第二个数
  • 整数值比较在Shell脚本编写中应用较多。可以用来判断已登录用户数量、开启进程数、磁盘使用率是否达标等。
[root@localhost ~]# unum=`who | wc -l`
[root@localhost ~]# [ $unum -gt 5 ]&& echo "litter"|| echo "Too many"
litter                      ## 查看登录的用户数量,大于等于5个发出Too many 的报警

三、字符串比较

  • 字符串比较通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的Shell脚本中,可以用来判断用户输入的位置参数是否符合要求。
  • 常用选项如下
=: 第一个字符串与第二个字符串相同
!=:第一个字符串与第二个字符串不相同,其中“!”符号表示取反
-z:检查字符串是否(Zero),对于未定义或赋予空值的变量将视为空串。

例:

[root@localhost ~]# echo $LANG  ## 查看当前语言环境
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ]&& echo  "Not en.US"  ## 字符串测试结果 (不等于)
Not en.US

四、逻辑测试

  • 逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同条件时,判断是根据这些条件同时成立还是只要有其中一个成立等情况,需要有一个测试的过程。
符号 意思
&& 逻辑与,表示 “而且”,且只有当两个条件都成立时,整个测试命令的返回值才为0(结果成立)。使用Test命令时,“&&”可改为 “-a”
|| 逻辑或,表示“或者”,只要前后两个命令有一个成立,整个测试命令的返回值才为0(结果成立)。使用Test命令时,“||”可改为 “-o”
! 逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为0(结果成立)。

五 、if语句

Shell脚本应用中,if语句时最为常用的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作(如果………那么…………)。

  • 根据不同的复杂程度,if语句的选择结构可以分为三种基本类型,适用于不同的应用场合

5.1 单分支的if语句

  • if语句的“分支”指的是不同测试结果所对应的执行语句(一条或则多条)。对于但分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作。
if 条件测试操作
then 
	命令序列
fi
  • 流程图
    在这里插入图片描述

5.2 双分支的if语句

  • 双分支的选择结构,要求针对“条件成立” “条件不成立”两种情况分别执行不同的操作。
if 条件测试操作
then
命令序列 1
else
命令序列 2
fi
  • 流程图
    在这里插入图片描述

5.3 多分支的if语句

  • 由于if语句可以根据测试结果的成立、不成立分别执行操作,所以能够嵌套使用,进行多次判断。
  • if 语句的嵌套在编写Shell脚本时并不常用,因为多重嵌套容易使程序结构更复杂。
  • 基本格式如下
if 条件测试语句 1
then
命令序列 1
elif 条件测试语句 2
then 
	命令序列 2
else
	命令序列 3
fi

  • 流程图
    在这里插入图片描述

5.3 if多分支语句的应用

  • 猜拳 ,用列举法使用if多分支语句
#! /bin/bash
 read -p "请输入您的出拳手势 其中  0代表拳头 1代表剪刀 2代表布 "  A
        B=$[$RANDOM%3]
if [ $A -ge 0 ]&&[ $A -le 2 ]
 then
  if [ $A -eq 0 ]
then
    if [ $B -eq 0 ]
then
        echo "您出的是拳头"
        echo "电脑出的也是拳头"
        echo "这局是平局"
elif [ $B -eq 1 ]
then
        echo "您出的是拳头"
        echo "电脑出的是剪刀"
        echo "您赢了!"
else
        echo "您出的是拳头"
        echo "电脑出的是布"
        echo "您输了,电脑赢了!"
fi
  elif [ $A -eq 1 ]
then
    if [ $B -eq 0 ]
then
        echo "您出的是剪刀"
        echo "电脑出的是拳头"
        echo "您输了,电脑赢了"
    elif [ $B -eq 1 ]
 then
        echo "您出的是剪刀"
        echo "电脑出的也是剪刀"
        echo "这局是平局"
else
        echo "您出的是剪刀"
        echo "电脑出的是布"
        echo "您赢了!"
fi
  elif [ $A -eq 2 ]
then
      if [ $B -eq 0 ]
then
         echo "您出的是布"
         echo "电脑出的是拳头"
         echo "您赢了"
     elif [ $B -eq 1 ]
 then
         echo "您出的是布"
         echo "电脑出的是剪刀"
         echo "您输了,电脑赢了"
 else
         echo "您出的是布"
         echo "电脑出的也是布"
         echo "这局是平局"
fi
else
        echo ""
fi
else
        echo "请输入正确的数字"
fi
          

猜你喜欢

转载自blog.csdn.net/weixin_47219725/article/details/107403294