条件测试怎么办?if case来判断

  • Post author:
  • Post category:其他

条件测试怎么办?if case来判断

一、条件测试

要使shell脚本程序具有一定的“智能”,便需要让其“识别”在不同情况下执行对应不同的操作。例如,当CPU使用达到80%时候进行友好提示;当备份目录不存在时自动创建目录等。

shell环境根据命令执行后的返回状态来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。使用test命令可以对特定的条件进行测试,并根据返回值来判断条件是否成立。test测试命令包括两种形式“test 条件表达式”或者“[条件表达式]“,两种方式作用相同,后者更为常用,但是一般方括号”[“或者”]”与条件表达式之间需要至少一个空格进行分隔。

根据需要测试的条件类型不同,条件表达式也不同。常用的条件测试包括文件测试、整数值比较、字符串比较,以及针对多个条件的逻辑测试。

1、文件测试

文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等。文件测试的常见操作选项有:

  • -d:判断是否为目录(directory)。

  • -e:测试目录或文件是否存在(exist)。

  • -f:测试是否为文件(file)。

  • -r:测试当前用户是否有权限读取(read)。

  • -w:测试当前用户是否有权限写入(write)。

  • -x:测试是否设置有可执行权限(excute)。

    执行条件测试操作后,通过预定义变量”$?“可以获得测试命令的返回状态值,从而判断该条件是否成立。例如:

以上分别判断了/opt/new_file和/opt/new_directory是否目录和文件,并且通过查看变量$?的值来判断前一步的条件测试结果。也可以结合命令分隔符&&和echo来更直观的表示查看测试结果。例如:

上述命令中,&&符号表示”而且“的关系,只有当前面的命令执行成功后才会执行后面的命令,否则后面命令会被忽略。

使用[[]]也可以进行条件测试,如下:

test命令中用于判断文件的选项有很多,从文件个数上分类的话,可以分为单个文件的判断两个文件之间的比较。其中判断单个文件最常用的选项为“-f“,再比较两个文件时,常用的选项有:

-nt:判断文件A是否比文件B新(new than)。

-ot:判断文件A是否比文件B旧(old than)。

-ef:判断两个文件是否为同一个文件,用来判断两个文件是否指向同一个inode(equal )。

2、整数值比较

整数值比较即根据给定的两个整数值,判断两者之间的大小关系,常用的操作选项有(使用时将参数放置于要比较的两个整数之间):

  • -eq:第一个数等于(equal)第二个数。

  • -ne:第一个数不等于(not equal)第二个数。

  • -gt:第一个数大于(greater than)第二个数。

  • -lt:第一个数小于(lesser than)第二个数。

  • -le:第一个数小于或等于(lesser or equal)第二个数。

  • -ge:第一个数大于或等于(greater or equal)第二个数。

例如:

上面第一个命令简单比较数字2和3的大小,第二条命令则查看当前已登录的用户数(通过命令”who | wc -l”获取

数值),当当前用户数小于5时输出OK。

3、字符串比较

字符串比较通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的shell脚本中,也可以用来判断用户输入的位置参数是否符合要求。字符串比较常用的选项有:

  • =:第一个字符串与第二个字符串是否相同。

  • !=:第一个字符串与第二个字符串不相同,其中”!“符号表示取反。

  • -z:检查字符串是否为空(zero),对于未定义或赋值为空的变量将视为空字符串。

例如,要判断当前系统的语言环境,如果不是“en.US”时输入提示信息“not en.US”可以执行下列操作:

4、逻辑测试

逻辑测试指的是判断两个或者多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,判断是根据这些条件全部同时成立还是只要其中有一个条件成立等情况,需要有一个测试的过程。常用的逻辑测试操作如下:

  • &&:逻辑与,表示“而且”,只有当前后两个条件同时成立时,整个测试命令的返回值才为0(结果成立)。使用test命令时,“&&”可以改为“-a”(and)。

  • ||:逻辑或,表示“或者”,只要前后两个条件中有一个成立时,整个测试命令的返回值即为0(结果成立)。使用test命令时,“||”可以改为”-o“(or)。

  • !:逻辑否,表示“不“,只有当指定的条件不成立时,整个测试命令的返回值才为0(结果成立)。

    上述逻辑测试的操作选项中,”&&”和“||”通常也同于间隔不同的命令操作,作用相似,如安装apache时,“make && makeintall”编译安装。

二、if语句

1、if语句的结构

shell脚本中,if语句时最为常用的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的指定操作(如果…那么…)。根据不同的复杂程度,if语句的选择结构分为三种基本类型。

1)单分支的if语句

if语句的分支指的时不同测试结果所对应的执行语句(一条或者多条)。对于单分支的选择结构,只有在条件成立时才会执行相应的代码,否则不执行任何操作。单分支if语句的语法格式为:

单分支if语句的执行流程为先判断条件测试的结果,如果结果成立(返回值0),则执行then后面的命令序列,一直到遇见fi结束判断为止,继续执行其他脚本代码;如果结果不成立(返回值非0),则忽略then后面的命令序列,直接跳到fi结束判断,再继续执行其他脚本代码。

2)双分支的if语句

对于双分支的选择结构,在”条件成立“和”条件不成立”两种情况对应不同的执行操作,语法格式为:

双分支if语句的执行流程为先判断条件测试的结果,如果条件成立,则执行then后面对应的命令序列1;忽略else及后面的命令序列2,直到遇到fi结束判断;如果条件不成立,则忽略then后面的命令序列1,直接跳至else后面的命令序列2并执行,直到遇见fi结束判断。

3)多分支的if语句

由于if语句可以根据测试结果的成立、不成立分别执行不同的操作,所以能够嵌套使用进行多次判断。多分支if语句的语法格式为:

2、if语句应用实例

1)单分支if语句应用

判断当前用户是否为root,是root则输出提示。如下:

判断当前内存使用情况是否过半,并输出提示信息。如下:

2)双分支if语句应用

判断目标主机存活性,并输出提示信息。其中ping命令的“-c”、“-i”、”-W“选项分别指定ping的次数3次、频率0.2s一次、响应超时时间为3秒。

3)多分支if语句应用

通过判断分数所在区间,判断对应所在的档次。如下:

三、case语句

1、case语句的结构

case语句适用于当某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列之时。这种情况与多分支的if语句非常相似,不同的是if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值。

case分支语句的语法结构如下所示。

在上述语句结构中,关键字case后面跟的是”变量值“,即”$变量名“,这点需要与for循环语句的结构加以区别。整个分支的结构包含在 case…esac之间,中间的模式1、模式2、…、*对应为变量的不同取值,其中 * 作为通配符,可匹配任意值。

case语句的执行流程为对不同取值进行匹配,取值相同则执行相应的命令序列,直至遇到双分号”;;“后跳至esac结束分支;如果与模式1不匹配,则继续与模式2进行比较,依此类推如下图:

使用case分支语句时,注意以下几点:

  • case行尾必须为单词”in“,每一模式必须以右括号”)“结束。

  • 双分号”;;“表示命令序列的结束。

  • 模式字符串中,可以用方括号表示一个连续的范围,如”[0-9]“;还可以用竖杠符号“|”表示或,如”A|B”。

  • 最后的“*)”表示默认模式,“ * ”相当于通配符。

2、case语句应用实例

1)检查用户输入的字符类型

交互提示用户键盘输入一个字符,通过case语句判断该字符是否为字母、数字或者其他控制字符,并给出相应的提示信息。

2)检查输入的成绩对应的奖惩情况

四、小结

  • 使用[]或test命令可以执行条件测试操作,包括字符串比较和整数比较、逻辑测试和文件测试等。
  • 整数比较操作符包括-gt、-lt、-eq、-ne、-ge、-le。
  • 常用的字符串比较操作符包括=、!=、-z。
  • 逻辑测试操作符包括&&、||、!。
  • 执行命令或程序会返回一个状态值,返回值为0表示执行成功;返回值非0值则表示执行失败或异常。
  • 通过使用if语句,可以根据条件有选择的执行不同操作,选择类型包括单分支、双分支和多分支。
    ,包括字符串比较和整数比较、逻辑测试和文件测试等。
  • 整数比较操作符包括-gt、-lt、-eq、-ne、-ge、-le。
  • 常用的字符串比较操作符包括=、!=、-z。
  • 逻辑测试操作符包括&&、||、!。
  • 执行命令或程序会返回一个状态值,返回值为0表示执行成功;返回值非0值则表示执行失败或异常。
  • 通过使用if语句,可以根据条件有选择的执行不同操作,选择类型包括单分支、双分支和多分支。
  • case语句可根据变量的不同取值执行不同的命令序列,比多分支的if语句结构更加清晰。

版权声明:本文为FP202530原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。