Shell 通用命令之流程控制(一)

225 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

经过前面的学习,都只是对文件的操作,下面总结一下必不可少的流程控制.

您能在这里看到啥

  1. 命令执行状态
  2. 条件表达式
  3. if语句

命令执行状态

在我编写解放双手系列工具的时候,经常会遇到一个问题.我怎么去判断当前命令是否执行成功呢.一开始,确实不太懂,经过我的不懈努力.总算找了.往下看

比如我们执行删除文件指令.rm test.txt,我们知道是否执行成功,有两个写法.

  /// 第一种
  vt=rm test.txt
  if $vt; then
      echo "删除成功"
  else 
      echo "删除失败"
  fi
  
  /// 第二种
  rm test.txt
  if [[ $? == 0 ]]; then
      echo "删除成功"
  else
      echo "删除失败"
  fi

从上面的代码,我们可以得到.要判断命令是否执行成功,可以通过$?这个值,进行判断.当然你也可以按照我的第一种方式,把命令的执行结果,赋值给一个变量,然后判断变量状态即可.

条件表达式

  1. 条件表达式理解

    条件表达式: 判断表达式是否正确的逻辑表达式.

    条件成立: 0

    条件不成立: 1

  2. 语法

    1. test命令
    2. [ 表达式 ]
    3. [[ 表达式 ]]
    4. (( 表达式 ))

    注意: 第二种和第三种.两边需要有空格.经验之谈,因为我在写解放双手系列的时候,可不少因为这个空格,导致 ! 提示.

    结合操作符,我们简单举例说明一下上面的语法.

    1. 操作符

      这里我们简单记录一下,平时用的操作符

      • 文件状态操作符

        文件状态操作符含义
        -d文件为目录.则为
        -f文件为普通文件.则为
        -r文件可读.则为
        -w文件可写.则为
        -u文件的SUID位被设置.则为
        -s文件长度>0.则为
        -x文件可执行.则为
      • 数字操作符

        数字操作符含义
        -eq相当于 ==
        -ne相当于 !=
        -lt相当于 <
        -gt相当于 >
        -le相当于 <=
        -eq相当于 >=
      • 逻辑操作符

        逻辑操作符含义
        -a相当于
        -o相当于
        -!相当于
    2. 命令

      1. test命令

        # 检测cdn文件是否是目录文件
        test -d cdn && echo 0 || echo 1
        0
        
      2. [ ] 命令

        []bash的内部命令,和test是一样的.比较运算符只能用==!=,不能整数判断,只能用字符串比较.如果你想比较数字,需要使用数字操作符.并且有一个小细节.在[]中,如果使用另一个sh文件定义的参数的时候,参数需要""来包裹的.

        1. 创建ts.sh
          #!/bin/bash
          name=ts
          
        2. 创建tst.sh
          /// 引入ts.sh文件
          source ts.sh
          [ "$name" == 1 ]
          # 检测cdn文件是否是目录文件
          [ 1 -eq 2 ] && echo 0 || echo 1
          1
          
      3. [[ ]]命令

        [[ ]] 支持字符串的模式匹配.可以使用=~操作符并且支持正则表达式.当我们使用字符串比较的时候,可以把判断条件右边的作为一个表达式(模式).不只是字符串.入下所示

        1. 正则表达式
          name="a"
          [[ $name == [a-z] ]] && echo "字母" || echo "不是"
          "字母"
          
        2. =~正则匹配
          name="my name is demo"
          [[ $name =~ d ]] && echo Y || echo N
          

          [[ ]] 中使用><时,系统会进行排序操作.并且支持 &&||.在test[]是不支持的.当然在[[ ]]中,获取其他文件的参数是可以不用""包裹的

      总结

      条件[ ][[ ]]
      正则匹配不支持支持
      <不支持支持,并作排序操作
      >不支持支持,并作排序操作
      ==字符匹配模式匹配
      &&和 “//”-a-o
      变量如果变量没有定义,那么需用双引号引起来不需要

if语句

  1. 单分支结构

    只有条件成立才会执行对应逻辑,否则不执行任何操作

    name="shell"
    if [ $name == "shell"  ]; then
       echo "单分支结构"
    fi
    
  2. 双分支结构

    如果条件成立执行对应逻辑,不成立,则执行不成立的对应逻辑

    name="shell"
    if [ $name == "shell"  ]; then
    echo "单分支结构"
    else
    echo "双分支结构"
    fi
    
  3. 多分支结构

    可以嵌套无数个双分支结构

    name="shell"
    if [ $name == "s"  ]; then
        echo "单分支结构"
    else if [ $name == "t" ];then
        echo "双分支结构"
    else if [ $name == "shell" ];then
        echo "多分支结构"
    else
        echo "就这吧"
    fi
    

系列文章

参考文章