zoukankan      html  css  js  c++  java
  • 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

              

        

  • 相关阅读:
    MVC ORM 架构
    Kubernetes 第八章 Pod 控制器
    Kubernetes 第七章 Configure Liveness and Readiness Probes
    Kubernetes 第六章 pod 资源对象
    Kubernetes 第五章 YAML
    Kubernetes 核心组件
    Kubernetes 架构原理
    Kubernetes 第四章 kubectl
    Kubernetes 第三章 kubeadm
    yum 配置及yum 源配置
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/7007615.html
Copyright © 2011-2022 走看看