美文网首页
Linux之Shell脚本编程(二)

Linux之Shell脚本编程(二)

作者: 蓦然飞跃 | 来源:发表于2020-06-28 15:25 被阅读0次

            在上一篇博文中,主要介绍了Shell脚本编程的背景,怎样创建人生中第一个Shell脚本以及Shell变量等内容。接下来将接着介绍介绍Shell编程,主要是围绕着Shell运算、流程控制语句、自定义函数以及脚本调试等方面展开。

    一、运算符

    例:
      num1=11
      num2=22
      sum=num1+num2
      echo $sum

    格式 : expr m + n 或$((m+n)) 注意expr运算符间要有空格
      expr命令:对整数型变量进行算术运算 (注意:运算符前后必须要有空格)
      expr 3 + 5
      expr 3 – 5
      echo `expr 10 / 3`
      10/3的结果为3,因为是取整
      expr 3 * 10 注意: \ 是转义符

    image.png
    例:计算(2 +3 )×4 的值

    1 .分步计算
       S=`expr 2 + 3`
       expr $S * 4

    2.一步完成计算
      expr `expr 2 + 3` * 4
      S=`expr `expr 2 + 3` * 4`
      echo $S
      或
      echo $(((2 + 3) * 4))


    image.png

    $()与${}的区别
      $( )的用途和反引号``一样,用来表示优先执行的命令
        eg:echo $(ls test.sh)
      就是取变量了eg:echo{PATH}
      $((运算内容)) 适用于数值运算
        eg: echo $((3+1*4))

    二、内置test命令

    内置test命令常用操作符号[]表示,将表达式写在[]中,如下:
        [ expression ]
      或者:
        test expression
      注意:expression首尾都有个空格
        eg: [ ] ;echo $?
      测试范围:整数、字符串、文件
      表达式的结果为真,则test的返回值为0,否则为非0。当表达式的结果为真时,则变量$?的值就为0,否则为非0

    1.字符串测试:

           test str1 == str2    测试字符串是否相等
      test str1 != str2   测试字符串是否不相等
      test str1        测试字符串是否不为空,不为空,true,false
      test -n str1      测试字符串是否不为空
      test -z str1      测试字符串是否为空
        eg:
          name=linzhiling
          [ “$name” ] && echo ok
          ; 命令连接符号
          && 逻辑与 条件满足,才执行后面的语句
          [ -z “$name” ] && echo invalid || echo ok
          || 逻辑或,条件不满足,才执行后面的语句
          test “$name” == ”yangmi” && echo ok || echo invalid


    image.png
    2.整数测试:

           test int1 -eq int2   测试整数是否相等 equals
      test int1 -ge int2   测试int1是否>=int2
      test int1 -gt int2    测试int1是否>int2
      test int1 -le int2    测试int1是否<=int2
      test int1 -lt int2     测试int1是否<int2
      test int1 -ne int2   测试整数是否不相等
        eg:
          test 100 –gt 100
          test 100 –ge 100
      如下示例两个变量值的大小比较:


    image.png
    3.文件测试:

           test -d file      指定文件是否目录
      test –e file     文件是否存在 exists
      test -f file       指定文件是否常规文件
      test –L File    文件存在并且是一个符号链接
      test -r file       指定文件是否可读
      test -w file      指定文件是否可写
      test -x file       指定文件是否可执行
        eg:
          test -d install.log
          test –r install.log
          test –f xx.log ; echo $?
          [ -L service.soft ] && echo “is a link”
          test -L /bin/sh ;echo $?
          [ -f /root ] && echo “yes” || echo “no”

    4.多重条件测试:

           条件1 –a 条件2 逻辑与 两个都成立,则为真
      条件1 –o 条件2 逻辑或 只要有一个为真,则为真
      ! 条件 逻辑非 取反
      eg:
        num=520
        [ -n “num”–a“num” –ge 520 ] && echo “marry you” || echo “go on”
        age=20
        pathname=outlog
        [ ! -d“$ pathname”] && echo usable || echo used

    image.png

    三、流程控制语句

    1.if/else 命令

    单分支if条件语句
           if [ 条件判断式 ]
        then
          程序
      fi
      或者
      if [ 条件判断式 ] ; then
         程序
      fi
      eg:
      #!/bin/sh
      if [ -x /etc/rc.d/init.d/httpd ]
        then
            /etc/rc.d/init.d/httpd restart
      fi
    单分支条件语句需要注意几个点:
      if语句使用fi结尾,和一般语言使用大括号结尾不同。
      [ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格
      then后面跟符号条件之后执行的程序,可以放在[]之后,用“;”分割,也可以换行写入,就不需要";"了。

    image.png
    多分支if条件语句
      if [ 条件判断式1 ]
        then
        当条件判断式1成立时,执行程序1
      elif [ 条件判断式2 ]
        then
        当条件判断式2成立时,执行程序2
      ...省略更多条件
      else
        当所有条件都不成立时,最后执行此程序
      fi

    示例:
      eg:
      #!/bin/bash
      read -p "please input your name:" NAME
      #echo $NAME
      if [ “$NAME” == root ]
        then
          echo "hello ${NAME}, welcome !"
      elif [ $NAME == tom ]
        then
          echo "hello ${NAME}, welcome !"
      else
          echo "SB, get out here !"
      fi


    image.png
    2.case in 命令

           case命令是一个多分支的if/else命令,case变量的值用来匹配value1,value2,value3等等。匹配到后则执行跟在后面的命令直到遇到双分号为止(;;)case命令以esac作为终止符。


    image.png
    3.for 循环

           for循环命令用来在一个列表条目中执行有限次数的命令。比如,你可能会在一个姓名列表或文件列表中循环执行同个命令。for命令后紧跟一个自定义变量、一个关键字in和一个字符串列表(可以是变量)。第一次执行for循环时,字符串列表中的第一个字符串会赋值给自定义变量,然后执行循环命令,直到遇到done语句;第二次执行for循环时,会右推字符串列表中的第二个字符串给自定义变量,依次类推,直到字符串列表遍历完。
      第一种:
      for N in 1 2 3
        do
        echo $N
      done
      第二种:
      for ((i = 0; i <= 5; i++))
        do
        echo "welcome $i times"
      done

    4.while 循环

           while命令根据紧跟其后的命令(command)来判断是否执行while循环,当command执行后的返回值(exit status)为0时,则执行while循环语句块,直到遇到done语句,然后再返回到while命令,判断command的返回值,当得打返回值为非0时,则终止while循环。
      格式
      while expression
        do
        command
        …
      done
    实例:求1-10各个数的平方?


    image.png
    5.函数

           函数代表着一个或一组命令的集合,表示一个功能模块,常用于模块化编程。
      以下是关于函数的一些重要说明:
        在shell中,函数必须先定义,再调用
        使用return value来获取函数的返回值
        函数在当前shell中执行,可以使用脚本中的变量。
    结构
    完整:
      function name() {
        statements
        [return value]
      }
    建议:
      function name {
        statements
        [return value]
      }
    函数调用
      调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:
        name
      如果传递参数,那么多个参数之间以空格分隔:
        name param1 param2 param3
    注意:
    1)不管是哪种形式,函数名字后面都不需要带括号。
    2)和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。
    3)Shell 也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。

    image.png

    相关文章

      网友评论

          本文标题:Linux之Shell脚本编程(二)

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