48小时系统班试听入口

linux shell脚本,入门到实战详解(二)

发布作者:新盟教育 发布日期:2022-03-07 浏览人数:97437人

红帽认证技术入门

前文指路:

linux shell脚本,入门到实战详解(一)


三、shell 编程流程控制语句

3.1 if 条件语句介绍

3.1.1 常用的单/双分支

if 条件语句:

 # If条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断
    # 单分支语句 ---比较大小
      if (条件表达式);then
        语句1
      fi


    # 双分支if 语句
      if (表达式)
        语句1
      else
        语句2
      fi
    # 多支条件语句 ---判断成绩
      if (表达式)
        语句1
      elif
        语句2
      elif
        语句2
      fi


3.1.2 if 常见判断逻辑运算符详解

常见逻辑判断运算符:

   -f     判断文件是否存在 eg: if [ -f filename ];
    -d     判断目录是否存在 eg: if [ -d dir     ];
    -eq    等于,应用于整型比较 equal;
    -ne    不等于,应用于整型比较 not equal;
    -lt    小于,应用于整型比较 letter;
    -gt    大于,应用于整型比较 greater;
    -le    小于或等于,应用于整型比较;
    -ge   大于或等于,应用于整型比较;
    -a    双方都成立(and) 逻辑表达式 –a 逻辑表达式;
    -o    单方成立(or) 逻辑表达式 –o 逻辑表达式;
    -z    空字符串;
    -x      是否具有可执行权限
    ||      单方成立;
    &&      双方都成立表达式。


3.1.3 使用单分支语句判断crond 进程是否在运行—案例

判断 crond 服务是否运行:

#!/bin/bash
    # this is check crond
    # by author rivers on 2021-9.23
    # 定义一个变量名
    name=crond
    num=$(ps -ef|grep $name|grep -vc grep)
    if [ $num -eq 1 ];then
        echo "$num running!"
    else
        echo "$num is not running!"
    fi


3.1.4 判断系统目录是否存在 —案例

判断系统目录是否存在:

 #!/bin/bash
    # this is check directory 
    # by author rivers on 2021-9.27 
     if  [  !  -d  /data/rivers  -a  !  -d  /tmp/rivers  ];then
     mkdir  -p  /data/rivers  f
     i


3.1.5 多个条件判断学生分数等级 — 案例

判断学生成绩等级:

# if 语句可以直接对命令状态进行判断,就省去了获取$?这一步!
      # 如果第一个条件符合就不再向下匹配
    #!/bin/bash
      # this check grade shell
      # by author rivers on 2021-09-27
      
      grade=$1
      if [ $grade -gt 90 ];then
        echo "Is's very good!"
      elif [ $grade -gt 70 ];then
        echo "Is's is good!"
      
      elif [ $grade -ge 60 ];then
        echo "pass"
      
      else
        echo "no pass"
      fi



3.2 for 循环语句介绍

for 循环语句:

   #格式:for name [ [ in [ word ... ] ] ; ] do list ; done
      for 变量名 in 取值列表; do
        语句 1
      done

3.2.1 检查同一局域网 多台主机是否存活

检查多台主机存活情况:

 #!/bin/bash
    # check hosts is on/Off
    # by rivers on 20219-23
    Network=$1
    for Host in $(seq 1 254)
    do
    ping -c 1 $Network.$Host > /dev/null && result=0 || result=1

    if [ "$result" == 0 ];then
      echo -e "\033[32;1m$Network.$Host is up \033[0m"
      echo "$Network.$Host" >> /tmp/up.txt

    else
      echo -e "\033[;31m$Network.$Host is down \033[0m"
      echo "$Network.$Host" >> /tmp/down.txt
    fi
    done


3.3 while 循环语句介绍

while 循环语句:


 # While循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于需要循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while…do开头,done结尾与 
    #while 关联的还有一个 until 语句,它与 while 不同之处在于,是当条件表达式为 false 时才循环,实际使用中比较少,这里不再讲解。

    while  (表达式)
    do
      语句1
    done

break 和 continue 语句:

# break 和 continue 语句
      break 是终止循环。
      continue 是跳出当前循环。
    #示例 1:在死循环中,满足条件终止循环
    while true; do
      let N++
      if [ $N -eq 5 ]; then
        break
    fi
      echo $N
    done
    输出:1 2 3 4
    #示例 2:举例子说明 continue 用法
    N=0
    while [ $N -lt 5 ]; do
      let N++
    if [ $N -eq 3 ]; then
      continue
    fi
      echo $N
    done

   
    输出:1 2 4
  # 打印 1-100 数字
    i=0
    while ((i<=100))
    do
            echo  $i
            i=`expr $i + 1`
    done


3.3.1 While循环求1-100的总和 —案例

求1-100的总和:

  #!/bin/bash
    # by author rivers on 2021-9-27
    j=0
    i=1
    while ((i<=100))
    do
         j=`expr $i + $j`
         ((i++))
    done
    echo $j


3.3.2 每10秒循环判断一次 hbs用户是否登录系统 —案例

每10秒循环判断系统登录:

[root@web-server01~/script]# vim login.sh 
    #!/bin/bash
    #Check File to change. 
    #By author rivers 2021-9-27
    USERS="hbs"
    while true
    do
            echo "The Time is `date +%F-%T`"
            sleep 10
            NUM=`who|grep "$USERS"|wc -l`
            if [[ $NUM -ge 1 ]];then
                    echo "The $USERS is login in system."
            fi
    done


3.4 case 选择语句介绍

case选择语句:

 #Case选择语句,主要用于对多个选择条件进行匹配输出,与if elif语句结构类似,通常用于脚本传递输入参数,打印出输出结果及内容,其语法格式以Case…in开头,esac结尾。语法格式如下:
    case 模式名  in
      模式 1)
        命令
        ;;
      模式 2)
        命令
        ;;
    *)
    不符合以上模式执行的命令
    esac
    # 每个模式必须以右括号结束,命令结尾以双分号结束。


3.4.1 使用case 编写一个 httpd 服务启动脚本

编写http服务启动脚本:

[root@web-server01~/script]# vim httpd_start.sh 
    # check http server start|stop|starus
    # by author rivers on 2021-9-27
    while true
    do
        echo -e "
        \033[31m start \033[0m
        \033[32m stop \033[0m 
        \033[33m status \033[0m
        \033[34m quit \033[0m 
    "
    read -p "请输入你的选择start|stop|quit:" char
    case $char in
    start)
        systemctl start httpd && echo "httpd服务已经开启" || echo "开启失败"
    ;;
    stop)
        systemctl stop httpd && echo "httpd服务已经关闭" || echo "关闭失败"
    ;;
    restart)
        systemctl restart httpd && echo "httpd服务已经重启" || echo "重启失败
    "
    ;;
    status)
        systemctl status httpd && echo -e "
            httpd 的服务状态
      
    ;;
    quit)


3.5 select 选择语句介绍

select选择语句:

#select 是一个类似于 for 循环的语句
    #Select语句一般用于选择,常用于选择菜单的创建,可以配合PS3来做打印菜单的输出信息,其语法格式以select…in do开头,done结尾:
    
    select i in (表达式) 
    do
    语句
    done
    # 选择mysql 版本
    #!/bin/bash
    # by author rivers on 2021-9-27
    PS3="Select a number: "
    while true; do
    select mysql_version in 5.1 5.6 quit;
     do
      case $mysql_version in
      5.1)
        echo "mysql 5.1"
          break
          ;;
      5.6)
        echo "mysql 5.6"
           break
           ;;
      quit)
        exit
        ;;
      *)
        echo "Input error, Please enter again!"
          break
    esac
     done
    done


3.5.1 使用select打印lnmp菜单栏 —案例

打印lnmp选择菜单:

 #!/bin/bash
    #by author rivers on 2021-9-27
    PS3="Please enter you select install menu:"
    select i in http php mysql quit
    do
    case $i in
            http)
            echo -e "
                    \033[31m Test Httpd \033[0m" 
            ;;
            php)
            echo  -e "\033[32m Test PHP\033[0m"
            ;;
            mysql)
            echo -e "\033[33m Test MySQL.\033[0m"
            ;;
            quit)
            echo -e "\033[32m The System exit.\033[0m"
            exit
    esac
    done


3.6 shell 函数、数组 编程 实战

函数:

 # Shell允许将一组命令集或语句形成一个可用块,这些块称为Shell函数,Shell函数的用于在于只需定义一次,后期随时使用即可,无需在Shell脚本中添加重复的语句块,其语法格式以function name(){开头,以}结尾。
 
  # Shell编程函数默认不能将参数传入()内部,Shell函数参数传递在调用函数名称传递,例如name args1 args2。
    # 函数语法
    func() {
    command1
    command1
    ……
    }
    fun  # 直接调用函数名
    # Shell 函数很简单,函数名后跟双括号,再跟双大括号。通过函数名直接调用,不加小括号。
    #!/bin/bash
    func() {
    VAR=$((1+1))
    return $VAR
    echo "This is a function."
    }
    func
    echo $?
    # bash test.sh 
    2

数组:

 # 数组是相同类型的元素按一定顺序排列的集合。
    格式:array=(元素 1 元素 2 元素 3 ...)
    用小括号初始化数组,元素之间用空格分隔。
     定义方法 1:初始化数组 array=(a b c)
     定义方法 2:新建数组并添加元素 array[下标]=元素
     定义方法 3:将命令输出作为数组元素array=($(command))


3.6.1 定义一个httpd 安装的函数 —案例

创建apache软件安装函数:

 [root@web-server01~/script]# vim xx.sh 
    #!/bin/bash
    #auto install apache
    #By author rivers 2021-09-27 
    #Httpd define path variable
    FILES=httpd-2.2.31.tar.bz2
    LES_DIR=httpd-2.2.31
    URL=http://mirrors.cnnic.cn/apache/httpd/
    PREFIX=/usr/local/apache2/
    function Apache_install ()
    {
    #Install httpd web server 
    if [[ "$1" -eq "1" ]];then
            wget -c $URL/$FILES &&  tar -jxvf $FILES && cd $FILES_DIR &&./configure
            if [ $? -eq 0 ];then
                    make && make install
                    echo -e "\n\033[32m--------------------------------------------
                    echo -e "\033[32mThe $FILES_DIR Server Install Success !\033[0m
            else
                    echo -e "\033[32mThe $FILES_DIR Make or Make install ERROR,Plea
                    exit 0
            fi
    fi
    }
    Apache_install 1
    # 调用函数,传参为1

3.6.2 遍历数组元素 — 案例

遍历数组元素:

#方法 1:
    #!/bin/bash
    IP=(10.0.0.1 10.0.0.2 10.0.0.3)
    for ((i=0;i<${#IP[*]};i++)); do
    echo ${IP[$i]}
    done
    # bash test.sh
    10.0.0.1
    10.0.0.2
    10.0.0.3


    #方法 2:
    #!/bin/bash
    IP=(10.0.0.1 10.0.0.2 10.0.0.3)
    for   IP   in ${IP[*]}; do
    echo $IP
    done






推荐阅读

>>>新手必备-Linux入门之云计算是什么

>>>红帽认证入门-Linux系统介绍及企业版本选型

>>>新手必备-Linux系统安装配置+Xshell远程连接

>>>Linux常用命令行合集之绝对路径和相对路径

>>>软连接与硬连接


运维界升职加薪必备的云计算技术,你学了吗?


学完高级运维云计算课程之后,你可以:


  • 跨越90%企业的招聘硬门槛

  • 增加70%就业机会

  • 拿下BAT全国TOP100大厂敲门砖

  • 体系化得到运维技术硬实力

  • 技术大佬年薪可达30w+


资源放送 

2022新版Linux运维高级云计算-红帽RHCE实战课程合集,扫描下方二维码即可领取!

图片



客服电话 15822722968 邮箱 799830458@qq.com 地址 天津市红桥区光荣道157号宝能创业中心2号楼-1、2门-907号
官方公众号
商务合作