美文网首页
工具篇-shell脚本编程快速入门(over)

工具篇-shell脚本编程快速入门(over)

作者: 秃头猿猿 | 来源:发表于2020-06-23 11:17 被阅读0次

    参考:《shell脚本-菜鸟教程》

    1 流程控制语句

    1.1 if语句

    • 语法1(if)

      if condition
      then
          command1 
          command2
          ...
      fi
      #写成一行
      if [condition]; then command; fi
      
      ######### 解释 ###########
      # if 代表判断开始
      #
      # fi 代表整个if语句结束
      ######### 结束 ########### 
      
      
    • 语法2(if else)

      if condition
      then
          command1 
          command2
          ...
      else
          command
      fi
      
    • 语法3(if else-if else)

      if condition
      then
          command1
      elif condition2
      then 
          command
      else
          command
      fi
      #具体等后面学到运算符再细讲
      

    2 运算符

    在shell中运算符分为以下几种:

    • 算数运算符
    • 关系运算符
    • 布尔运算符
    • 字符串运算符
    • 文件运算符

    注意:

    原生的bash是不支持数学运算的,所以我们需要借助其他的命令帮助我们去执行,最常用的就是expr,这是一款表达式计算工具,可以帮助我们去完成求值操作。例如:

    image-20200615161658392

    从图中可知 两数相加 运算符中间必须要有空格,否则无法计算

    2.1 算数运算符

    • 说明

      运算符 说明
      + 加法
      - 减法
      * 乘法(注意:*在脚本里面是通配符,所以在使用时需要转义)
      / 除法
      % 取余
      = 赋值
      == 相等。两个数字进行相比,相等为true,不等false
      != 不相等 两个数字相比 不等为true,相等为false
    • 案例

      #!/bin/bash
      a=10;
      b=20;
      echo "a + b = $result"
      
      # 减法
      result=`expr $a - $b`;
      echo "a - b = $result"
      
      # 乘法
      result=`expr $a \* $b`
      echo "a * b = $result"
      
      # 除法
      result=`expr $a / $b`
      echo "a / b = $result"
      
      # 取余
      result=`expr $a % $b`
      echo "a % b = $result"
      
      #赋值
      re=$result
      echo "赋值: $re"
      
      #赋值
      re=$result
      echo "赋值: $re"
      
      ############# 解释 ##################################################################
      #
      #   判断 == 必须用[] 包裹起来 且比较符之间必须要有空格  
      #   这种写法[$a==$b]是错误的
      #   这种写法[ $a== $b ]是正确的
      #   这种比较只能放在流程控制语句种,如果把[$a == $b]赋值给一个变量或者输出,得不到想要的结果
      #
      #    if和条件之间必须要有 空格 
      #    当if条件结束时 必须写上fi,代表fi结束
      #
      ######################################################################################
      if [ $a == $b ]
      then
        echo 'a 等于b'
      else
        echo 'a 不等于 b'
      fi
      
      if [ $a != $b ]
      then    
        echo "a !=b"
      else
        echo "a == b"
      fi
      

      执行结果如下:

      image-20200615170111497

    2.2 关系运算符

    • 简介

      关系运算符只支持数字和字符串为纯数字的字符串

      运算符 说明
      -eq 等于; 两个数比较,相等返回true,不等返回false
      -ne 不等于;两个数比较 不等返回true ,相等返回false
      -gt 大于;两个数比较,左边的数据大于右边边的数据 返回true,否则返回false
      -lt 小于;两个数比较,左边的数大于右边的数返回false,否则返回true
      -ge 大于等于;两个数比较,左边的数大于或者等于右边的数 返回true,否则返回false
      -le 小于等于;两个数比较 左边的的小于或者等于右边的数 返回true 否则返回false
    • 案例

      #!/bin/bash
      a=20
      c=10
      
      # -eq等于
      if [ $a -eq $c ]
      then
         echo 'a -eq c : a 等于 c'
      else
        echo "a -eq c : a 不等于 c"
      fi
      
      #-ne 不等于
      if [ $a -ne $c ]
      then
         echo 'a -ne c : a 不等于 c'
      else
         echo "a -ne c : a 等于 c"fi
      # -gt 大于
      if [ $a -gt $c ]
      then
        echo "a -gt c: a大于c"
      else
        echo "a -gt c:  a 小于c"
      fi
      
      # -lt 小于
      if [ $a -lt $c ]
      then
        echo "a -lt c: a大于c"
      else
        echo "a -lt c:  a 小于c"
      fi 
      # -ge 大于等于
      if [ $a -ge $c ]
      then
        echo "a -ge c: a大于等于c"
      else
        echo "a -ge c:  a 小于等于 c"
      fi
      
      # -le 小于等于
      if [ $a -le $c ]
      then
        echo "a -le c: a大于等于c"
      else
        echo "a -le c:  a 小于等于 c"
      fi
      

      执行脚本

      image-20200615201717370

    2.3 逻辑运算符

    对布尔结果进行计算

    运算符 说明
    ! 对布尔结果取反,如果结果为true,取反结果为false
    -a 与 左右边结果都为true,整个结果为true
    -o 只要一个结果为true,整个结果为true
    && 如果左边结果为false,就不会执行右边,直接整个结果为false
    || 如果左边为true,就不会执行右边,直接整个结果为true

    案例

    #!/bin/bash
    a=13
    b=14
    
    # 取反 符号与表达式之间要有空格
    if [ ! $a -gt $b ]
    then
      echo "对 $a -gt $b 结果取反"
    fi
    
    #-a 与运算,即使左边结果为false,也会计算右边
    if [ $a -lt 20 -a $a != 100 ]
    then
     echo "-a 与运算"
    fi
    
    #-o 或运算 即使左边结果为true也会再去计算右边
    if [ $a -lt 20 -o $a -gt $b ]
    then
    echo "-o 与运算"
    fi
    
    #&& 逻辑与运算 如果左边结果为false,整个结果为false,不会再去计算右边,只有当左边结果为true时才会计算右边
    # 必须用双中括号包裹起来
    if [[ $a -lt $b && $b != 100 ]]
    then
       echo "逻辑与运算"
    fi
    
    #|| 逻辑||运算 如果左边结果为true,整个结果为true,不会再去计算右边,只有当左边结果为false时才会计算右边
    # 必须用双中括号包裹起来
    if [[ $a -lt $b || $b != 100 ]]
    then
       echo "逻辑或运算"
    fi
    

    结果如下:

    image-20200615212155396

    2.4 字符串运算符

    对字符串进行逻辑判断。

    逻辑表达式 说明
    = 用来比较两个字符串,如果字符串相等返回true,否则返回false
    != 用来比较两个字符串,如果不等返回true,相等返回false
    -z 用来检测字符串长度是否为0,为0返回ture,不为0返回falses
    -n 用来检测字符串长度,如果长度不为0返回true,否则返回false
    $ 用来检测字符串是否为空,不为空返回true

    案例

    #!/bin/bash
    a="lisi"
    b=""
    c="wangwu"
    
    echo "a 字符串内容为:$a"
    echo "b 字符串内容为:$b"
    echo "c 字符串内容为:$c"
    
    if [ $c = $a ]
    then
      echo "a 与 c比较  不等" 
    else
      echo "a 与 c比较 相等"
    fi
    
    
    if [ $a != $c ]
    then
      echo "a 与 c比较  不等" 
    else
      echo "a 与 c比较 相等"
    fi
    
    if [ -z $b ]
    then
      echo "b 的字符串长度为0"
    else
      echo "b 的字符串长度不为0"
    fi
    
    
    #要用 双引号包裹起来
    if [-n "$c" ]
    then
      echo "c 的字符串长度不为0"
    else
      echo "c 的字符串长度为0"
    fi
    
    if [ $b ]
    then
      echo "b字符串内容为空"
    else
      echo "b的字符串不为空"
    fi
    

    结果如下:

    image-20200623093536521

    2.5 文件操作符

    在linux中,一切皆文件,因此我们可以对进行进行一些逻辑操作

    符号 说明
    -b 检测是否为块设备(u盘,硬盘)文件,如果是 返回true,否则返回fals(这个不怎么常用,了解即可)
    -c 用来检测是否为字符设备(键盘,打印机)文件,如果是返回true,否则返回false(不怎么常用,了解即可)
    -d 用来检测文件是否为目录,如果是返回true,否则返回false
    -f 用来检测文件是否为普通文件,如果是返回true,否则返回false
    -r 用来检测文件是否可读,可读返回true,否则返回false
    -w 用来检测文件是否可写,可读返回true,否则返回false
    -x 用来检测文件是否可执行,可执行返回true,否则返回false
    -s 用来检测文件是否为空,主要是是看文件大小是否为0,是返回true,不是返回false
    -e 用来检测文件(目录)是否存在,如果存在返回true,不存在返回false

    案例:

    #!/bin/bash
    path="./test1.sh"
    echo "文件地址: $path"
    
    if [ -b $path ] 
    then
      echo "当前文件是块设备文件"
    else
     echo "当前文件不是块设备文件"
    fi
    
    if [ -c $path ] 
    then
      echo "当前文件是块字符设备文件"
    else
     echo "当前文件不是字符设备文件"
    fi
    
    if [ -d $path ] 
    then
      echo "当前文件是目录文件"
    else
     echo "当前文件不是目录文件"
    fi
    
    if [ -f $path ] 
    then
      echo "当前文件是普通文件"
    else
     echo "当前文件不是普通文件"
    fi
    
    if [ -r $path ] 
    then
      echo "当前文件是可读文件"
    else
     echo "当前文件不是可读文件"
    fi
    
    if [ -w $path ] 
    then
      echo "当前文件可写"
    else
     echo "当前文件不可写"
    fi
    
    if [ -x $path ] 
    then
      echo "当前文件是可执行文件"
    else
     echo "当前文件不是可执行文件"
    fi
    
    if [ -s $path ] 
    then
      echo "当前文件是不为空"
    else
     echo "当前文件为空"
    fi
    
    if [ -b $path ] 
    then
      echo "当前文件存在"
    else
     echo "当前文件不存在"
    fi
    

    结果如下:

    image-20200623101940456

    3 循环

    3.1 for循环

    • 语法

      for loop in item1 item2 ...
      do
        code1...
        code2...
      done
      
      或者
      
    • 案例1

      #!/bin/bash
      for loop in 1 5 6 7 8 89
      do      
        echo "循环的数据为 $loop"
      done      
      

      结果为:

      image-20200623104611442
    • 案例2

      #!/bin/bash
      arr=(1 7 8 99)
      for loop in ${arr[@]}
      do
        echo "循环的数据为 $loop"
      done
      
      image-20200623105142489

    3.2 while循环

    • 语法

      while 条件
      do
        code1
        code2
        ...
      done
      
    • 案例1

      #/bin/bash
      num=1
      #需要两个括号把条件包裹起来
      while(($num < 5))
      do
         echo "每次循环的数据为:$num"
      # let 这个是linux自带的一个变量计算的一个命令
         let "num++"
      done
      
      image-20200623105833943
    • 案例2

      #/bin/bash
      num=0
      arr=("lisi" 5 7)
      #获取数组长度
      length=${#arr[@]}
      while(($num < length ))
      do
         echo "每次循环的数据为:${arr[num]}"
      # let 这个是linux自带的一个变量计算的一个命令
         let "num++"
      done
      
      image-20200623110134096

    3.3 死循环

    for((;;))
    或者
    while true
    do
        code
        code
        ...
    done
    

    3.4 跳出循环

    • 简介

      • break 跳出循环
      • continue 跳出本次循环
    • break案例

      #/bin/bash
      num=0
      arr=("lisi" 5 7)
      #获取数组长度
      length=${#arr[@]}
      while(($num < length ))
      do
         echo "每次循环的数据为:${arr[num]}"
         break
      # let 这个是linux自带的一个变量计算的一个命令
         let "num++"
      done
      
      image-20200623110615921
    • continue 案例

      #/bin/bash
      num=0
      arr=("lisi" 5 7)
      #获取数组长度
      length=${#arr[@]}
      while(($num < length ))
      do
         echo "每次循环的数据为:${arr[num]}"
         # let 这个是linux自带的一个变量计算的一个命令
         let "num++"
         continue
      done
      
      image-20200623110805579

    相关文章

      网友评论

          本文标题:工具篇-shell脚本编程快速入门(over)

          本文链接:https://www.haomeiwen.com/subject/bwpcfktx.html