• bash脚本编程学习笔记(一)


      bash脚本语言,不同于C/C++是一种解释性语言。即在执行前不需要事先转变为可执行的二进制代码,而是每次执行时经解释器解释后执行。bash脚本语言是命令的堆砌,即按照实际需要,结合命令流程机制实现的源程序,因此他学习起来要比C/C++简单的多。

      1.bash中的变量

        bash中的变量分为本地变量,局部变量和环境变量等

          本地变量:使用格式为varname=值,本地变量的声明周期为整个脚本进程

          局部变量:使用格式为local varname=值,局部变量的声明周期为整个脚本进程

          环境变量:使用格式为export varname=值,作用域为当前shell进程及子进程。命令脚本在执行时,会启动shell的子进程,命令行中启动的脚本会继承当前的shell环境变量,系统自动执行脚本(非命令行启动)就需要自我定义环境变量

          位置变量:$1,$2...表示引用的参数

              shift:踢出参数  shift n:表示踢出n个参数

          特殊变量:$?保存了上一个命令执行的状态返回值(程序执行可能有两类返回值,一种是执行的状态返回值,一种是执行命令的返回值)

              程序状态返回代码:(0-255)

              0:表示执行正确

              1-255:都是错误的

        

        撤销变量:uset 变量名称

        查看当前shell中的变量:set命令

        查看当前shell中的环境变量:printenv,env,export

        在原来的值后面补加一个值:

          ANIMALS=pig

          ANIMALS=$ANIMALS:gost

          执行结果:pig:gost

        注意:变量名称只能包含字母、数字和下划线,并且不能以数字开头,不应该跟系统中已有的环境变量重名,最好做到见名知意。

        2.bash中的条件判断

          条件测试类型:

            整数测试,字符测试,文件测试

          条件测试的表达式:

            [ express ]:注意括号两侧有空格,括号中的表达式是关键字

            [[express]

          怎么写一个条件表达式:

            整数比较:

              -eq:测试两个整数是否相等,$A -eq $B

              -ne:测试两个整数是否不等,不等为真,相等为假

              -gt:测试一个数是否大于一个数,大于为真,小于为假

              -lt:测试一个数是否小于一个数,小于为真,大于为假

              -ge:大于或等于

              -le:小于或等于

            文件测试:

              -e 文件名/文件路径 测试文件是否存在

              -f 文件名/文件路径 测试文件是否为普通文件

              -d 文件名/文件路径 测试文件是否是目录

              -r 文件名/文件路径  测试文件是否是可读的

              -w 文件名/文件路径 测试文件是否是可写的

              -x 文件名/文件路径 测试当前用户是否可读可写可执行

        练习:给定一个文件,如果是一个普通文件,就显示之;如果是一个目录也显示之,否则就显示无法识别这个文件。
        #!/bin/bash
        FILE=/etc/inittab
        if [ ! -e $FILE ];then
        echo "No such file."
        exit 6
        elif [ -f $FILE ];then
        echo "common file"
        elif[ -d $FILE ];then
        echo "directory"
        else
        "unknown"
        fi

        3.命令件的逻辑关系

          逻辑与:&&

            第一个条件为假时,第二个条件不用再判断,最终结果已经有;

            第一个条件为真,第二个条件必须得判断

          逻辑或:||

            只要有一个条件为真即可

          eg:

            user1存在就输出hello student

              id user1 &> /dev/null&&echo "hello student" 

            如果user6不存在,就添加用户user6

              !id user6&&useradd user6

              id user6||useradd user6

            如果用户存在,就显示此用户否则就添加此用户

              id user1&&useradd user1||echo "user1 exits"

            如果用户不存在,就添加,否则显示已存在

               !id user1&&useradd user1||echo "user1 exits"  

            如果用户不存在,添加并且给密码;否则显示其已经存在

              !id user1&&useradd&&echo "user1"|passwd --stdin user1||echo "user1 exits"  //使用管道给user1添加密码

        4.在shell中进行运算

          1.使用let命令做运算:let C=$A+$B

          2.$[算数运算表达式]:C=$[$A+$B]

          3.$((运算表达式)):C=$(($A+$B))

          4.expr算数运算表达式,表达式中各操作及运算符之间要有空格,而且要使用反引号将命令引用

            C=`expr $A+$B`

        5.条件判断控制结构    

        单分支的if语句:
          if 判断条件; then
          statement1
          statement2
          fi
     
        双分支的if语句:
          if 判断条件; then
          statement1
          statement2
          else
          statement3
          statement4
          fi
     
        多分支的if语句
          if 判断条件;then
          statement1
          ...
          elif 判断条件;then
          statement2
          ...
          elif 判断条件;then
          statement3
          ...
          else
          statement4
          ...
          fi
        
        练习:如果用户已存在,则显示存在,如果不存在添加用户
          if id $NAME &> /dev/null;then //&> /dev/null 表示不显示输出信息,&> 为重定向
          echo "$NAME exits"
          else
          useradd $NAME
          echo $NAME|passwd --stdin $NAME &> /dev/null //为用户设定密码
          echo "Add $NAME finish"
          fi
     
        练习:写一个脚本
          给定一个文件,比如/etc/inittab,判断这个文件中是否有空白行;如果有,则显示其空白行数;否则显示没有空白行
          #!/bin/bash
          $FILE=/etc/inittab
          if grep "^$" &> /dev/null;then //使用正则表达式来判断是否有空白行
            echo "total blank lines `grep "^$" $FILE|wc -l`" //使用管道计算
          else
            echo "No blank lines"
          fi
     

          练习:写一个脚本

            判断当前系统上是否有用户默认shell为bash,如果有,就显示其中的一个用户名,否则就显示没有这类用户

              #!/bin/bash

              grep "/<bash$" /etc/passwd &>/dev/null

              RETVAL=$?    //上一条命令的执行状态码,为0表示执行成功,否则失败

              if [ $RETVAL -eq 0 ];then

                AUSERS=`grep "<bash$" /etc/passwd|head -1|cut -d: -f1`  //显示用户名

                echo "$AUSERS is one of such user"

              else

                echo "no such user"

              fi

        

        6.选择结构case语句
        case SWITCH in
        value1)
        statement
        ...
        ;; //以双分号结尾
        value2)
        statement
        ...
        ;;
        *)
        statement
        ...
        ;;
       esac
     
    练习:写一个脚本
    传递一个参数,判断这个参数是数字还是字母还是特殊字符
    #!/bin/bash
    case $1 in
    [ 0-9 ])
    echo "Adigit";;
    [ a-z ])
    echo "Lower";;
    [ A-Z ])
    echo "Upper";;
    *)
    echo "Special charactor";;
    esca
     
      练习:写一个脚本
      只接受参数start,stop,restart,status其中之一,如果传入的不是这四个参数则提示
        #!/bin/bash
        case $1 in
        'start')
        echo "start";;
        'stop')
        echo "stop";;
        'restart')
        echo "restart";;
        'status')
        echo "status";;
        *)
        //echo "please input start or stop or restart or status"
        echo "`basename $0` {start|stop|restart|status}";;
        esac
        7.bash脚本的结构
          顺序结构
          选择结构
            if
            case
          循环结构
            for
            while
            until
     
    for循环:
    for 变量 in 列表;do //形式1
    statement
    done
     
    for ((expr1;expr2;expr3));do //形式2,近似于C语言
    list
    done
     
    练习:计算1-100以内正整数的和;
    #!/bin/bash
    declare -i SUM=0
    for I in [1-100];do
    let SUM+=$I
    done
    echo $SUM
     
    #!/bin/bash
    declare -i SUM=0
    for ((I=1;I<=100;I++));do
    let SUM+=$I;
    done
    echo $SUM
    while循环:
      while CONDTION;do
      statement
      done
    进入循环,条件满足
    退出条件,条件不满足
     
    until循环: //形式跟while一样,但是进入退出循环条件刚好相反
      until CONDITION;do
      statement
      done
    进入循环,条件不满足
    退出循环,条件满足
      
    练习:写一个脚本
    要求用户输入一条信息,将里面的小写字符全部换成大写的
    #!/bin/bash
    read -p "Input something" STRING
    while [ $STRING != 'quit' ];do
    echo $STRING|tr 'a-z' 'A-Z'
    read -p "Input something,again" STRING
    done
     
    #!/bin/bash
    read -p "Input something" STRING
    until [$STRING == 'quit' ];do
    echo $STRING|tr 'a-z' 'A-Z'
    read -p "Input something,again" STRING
    done
     
    练习:写一个脚本
    每隔5秒钟查看hadoop是否登录,如果登录就退出,否则一直执行
    #!/bin/bash
    who|grep "hadoop" &>/dev/null
    RETVAL=$?
    while [ $RETVAL -ne 0 ];do //没登录
    echo "`data`,hadoop is not logged"
    sleep 5
    who|grep "hadoop" &>/dev/null
    RETVAL=$?
    done
    echo "hadoop is logged in"
     
    #!/bin/bash
    who|grep "hadoop" &> /dev/null
    RETVAL=$?
    until [ $RETVAL -eq 0 ];do //没登录
    echo "`data`,hadoop is not logged"
    sleep 5
    who|grep "hadoop" &> /dev/null
    RETVAL=$?
    done
    echo "hadoop is logged in"
     
    8.循环控制的方法
        在while,until , for循环结构中
          break:提前退出循环
          continue:提前进入下一轮循环
    练习:写一个脚本计算1-100以内奇数得和
      #!/bin/bash
      let SUM=0
      let I=0
      while [ $I -lt 100 ];do
      let I++
      if [ $[$I%2] -eq 0 ];then
      continue; //如果是偶数则提前进入下一轮循环
      fi
      let SUM+=$I
      done
    echo $SUM

              

        

  • 相关阅读:
    jvm类加载
    SpringMVC拦截器踩坑日记
    ConcurrentHashMap源码
    HashMap源码
    Linux搭建数据质量监控 Griffin
    那些说代码管理不方便的,我估计是你不会用git(Git源码管理)
    VS2019 开发AngularJS(TypeScript)代码缩进处理
    Arraylist和Map哪个性能更好
    dynamics crm 团队及团队模板
    无法加载文件或程序集 PublicKeyToken=null'或其依赖之一,需要强名称的程序集
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/7007615.html
Copyright © 2020-2023  润新知