[Linux][Shell][Shell逻辑控制]详细讲解

目录

  • 1.if 判断
    • 1.if-then
    • 2.if-then-else
    • 3.elif
    • 4.case
    • 5.实际上手
  • 2.条件测试
    • 0.事前说明
    • 1.test 命令
    • 2.[]
    • 3.双括号
      • 1.(())
      • 2.[[]]
    • 4.实际上手
  • 3.循环
    • 1.for
    • 2.while
    • 3.until命令
    • 4.控制循环
      • 1.break
      • 2.continue
    • 5.处理循环的输出


1.if 判断

1.if-then

  • 语法
    if command
    then
    	command
    fi
    
  • bash的if语句和其他编程语言不一样,bash的if语句会直接运⾏if后⾯的命令
    • 如果该命令执⾏正确(状态码为0),处于then的命令就会被执⾏
    • 否则就不会执行,或者执行其他逻辑的语句,最后到fi结束逻辑控制

2.if-then-else

  • 语法
    if command
    then
    	command
    else
    	command
    fi
    

3.elif

  • 语法
if command
then
	command
elif command
then
	command
fi

4.case

  • 可以代替多if-else分支
    case "变量" in
    值1)
     命令
     ;;
    值2)
     命令2
     ;;
    *)
     命令
    

5.实际上手

  • 内存监控
    #!/bin/bash
    
    FreeMem=`free -m | awk 'NR==2 {print $NF}'`
    CHARS="Current memory is $FreeMem"
    
    if [ "$FreeMem" -lt 16000 ]
    then
        echo $CHARS
        echo "内存不足,抓紧维护服务器!"
    fi
    
  • 读取比较大小
    • 单分支版本
      #!/bin/bash
      
      a=$1
      b=$2
      
      if [ $a -lt $b ]
      then
          echo "Yes, $a less than $b"
          exit 0
      fi
      
      if [ $a -eq $b ]
      then
          echo "Yes, $a equal $b"
          exit 0
      fi
      
      if [ $a -gt $b ]
      then
          echo "Yes, $a greater than $b"
          exit 0
      fi
      
    • 多分支版本
      #!/bin/bash
      
      a=$1
      b=$2
      
      if [ $a -lt $b ]
      then
          echo "Yes, $a less than $b"
          exit 0
      elif [ $a -eq $b ]
      then
          echo "Yes, $a equal $b"
          exit 0
      else [ $a -gt $b ]
          echo "Yes, $a greater than $b"
          exit 0
      fi
      
  • MySQL监控脚本
    #!/bin/bash
    
    if [ `netstat -tunlp | grep mysql | wc -l` -ge "1" ]
    then
        echo "MySQL is running"
    else
        echo "MySQL is stopped"
        # systemctl start mysql.service
    fi
    
  • Rsync启动脚本
    #!/bin/bash
    
    if [ "$#" -ne 1 ]
    then
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    fi
    
    if [ "$1" = "start" ]
    then
        /usr/bin/rsync --daemon
        sleep 2
    
        if [ `netstat -tunlp | grep rsync | wc -l` -ge 1 ]
        then
            echo "Rsync is started"
            exit 0
        fi
    elif [ "$1" = "stop" ]
    then
        killall rsync &>/dev/null
        sleep 2
    
        if [ `netstat -tunlp | grep rsync | wc -l` -eq 0 ]
        then
            echo "Rsync is stopped"
            exit 0
        fi
    elif [ "$1" = "restart" ]
    then
        kill rsync
        sleep 1
    
        killpro=`netstat -tunlp | grep rsync | wc -l`
        /usr/bin/rsync --daemon
        sleep 1
    
        startpro=`netstat -tunlp | grep rsync | wc -l`
    
        if [ "$killpro" -eq 0 -a "$startpro" -ge 1 ]
        then
            echo "Rsync is restarted"
            exit 0
        fi
    else
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    fi
    

2.条件测试

0.事前说明

  • 条件测试常用的语法
    请添加图片描述

  • 常用字符串测试操作符
    请添加图片描述

  • 数值比较
    请添加图片描述

  • 逻辑操作符
    请添加图片描述

  • 各命令对照表
    请添加图片描述


1.test 命令

  • test命令最短的定义可能是评估⼀个表达式
    • 如果条件为真,则返回⼀个0值
    • 如果表达式不为真,则返回⼀个⼤于0的值—,也可以将其称为假值
    • 检查最后所执⾏命令的状态的最简便⽅法是使⽤$?
  • 参数
    • 关于某个文件名的类型侦测(存在与否),如:test -e filename

      参数意义
      -e该 文件名 是否存在
      -f该 文件名 是否为文件(file)
      -d该 文件名 是否为目录(directory)
      -b该 文件名 是否为block device装置
      -c该 文件名 是否为一个character device装置
      -S该 文件名 是否为一个Socket文件
      -p该 文件名 是否为一个FIFO(pile)文件
      -L该 文件名 是否为一个连接档
    • 关于文件的权限侦测,如:test -r filename

      参数意义
      -r该 文件名 是否具有可读的属性
      -w该 文件名 是否具有可写的属性
      -x该 文件名 是否具有可执行的属性
      -u该 文件名 是否具有SUID的属性
      -g该 文件名 是否具有SGID的属性
      -k该 文件名 是否具有Sticky bit的属性
      -s该 文件名 是否为非空白文件
    • 关于两个文件之间的比较,如:test file1 -nt file2

      参数意义
      -nt(newer than),判断file1是否比file2
      -ot(older than),判断file1是否比file2
      -ef判断file1file2是否为同⼀⽂件,可⽤在硬链接的判定上
      主要意义在判定,两个⽂件是否均指向同⼀个inode
    • 关于两个整数之间的判定,如:test num1 -eq num2

      参数意义
      -eq两数相等
      -ne两数不相等
      -gtnum1大于num2
      -ltnum1小于num2
      -genum1大于等于num2
      -lenum1小于等于num2
    • 判定字符串的数据

      参数意义
      -z为空串,则返回true
      -n不为空串,则为true
      =str1 == str2,则返回true
      !=str1 != str2,则返回true
    • 多重条件判断,如:test -r filename -a -x filename

      参数意义
      -a(and)两状况同时成立
      -o(or)两状况任何一个成立
      !逻辑取反

2.[]

  • 脚本中经常进行条件测试,用的最多的,就是中括号[]
  • test[]的作用是一样的
  • 基本要素
    • []两个符号,左右都要有空格分隔
    • 内部操作符与操作变量之间要有空格,如:[ "a" = "b" ]
    • 字符串比较中,> <需要写成\> /<进行转义
    • []中字符串或者${}变量尽量使用""双引号括住,避免值未定义引用
      [ -n "$filename" ]
      
    • []中可以使用-a -o进行逻辑运算,不支持&& ||
    • []是bash内置命令

3.双括号

1.(())

  • bash支持双小括号,写入高级数学表达式

2.[[]]

  • 双中括号提供了针对字符串的⾼级特性,模式匹配,正则表达式的匹配
  • 基本要素
    • [[]]两个符号,左右都要有空格分隔
    • 内部操作符与操作变量之间要有空格,如:[[ "a" = "b" ]]
    • 字符串比较中,可以直接使用> <,无需转义
    • [[]]中字符串或者${}变量尽量使用""双引号括住
      • 如未使用""双引号括住的话,会进行模式和元字符匹配
    • [[]]内部可以使用&& ||进行逻辑运算
    • [[]]是bash的keyword
    • [[]]其他用法都和[]一样

4.实际上手

  • 测试逻辑判断
    #!/bin/bash
    
    read -p "Pls input a char:> " var1
    
    [ "${var1}" -eq 1 ] && {
        echo ${var1}
        exit 0
    }
    
    [ "$var1" -eq 2 ] && {
        echo $var1
        exit 0
    }
    
    [ "$var1" -ne "1" -a "$var1" -ne "2" ] && {
        echo "Script Error"
        exit 1
    }
    
  • 模拟安装脚本
    #!/bin/bash
    
    path=/scripts
    
    [ ! -d "$path" ] && mkdir -p scripts
    
    cat << END
    	1.[install lamp]
    	2.[install inmp]
    	3.[exit]
    END
    
    read -p "Pls input your choice:> " num
    
    # 判断输入是否合法
    [[ ! $num =~ [1-3] ]] && {
    	echo "The num you input must be in {1|2|3}"
    	echo "Input Error"
    	exit 1
    }
    
    [ $num -eq 1 ] && {
    	echo "start installing lamp...waiting..."
    	sleep 2
    
    	# 如果该脚本没权限
    	[ ! -x "$path/lamp.sh" ] || {
    		echo "The file does not exit or can't be exec"
    		exit 2
    	}
    
    	# 安装脚本
    	source ${path}/lamp.sh
    	exit $?
    }
    
    [ $num -eq 2 ] && {
    	echo "start installing lnmp...waiting..."
    	sleep 2
    	[ ! -x "$path/lnmp.sh" ] || {
    		echo "The file does not exit or can't be exec"
    		exit 3
    	}
    	source ${path}/lnmp.sh
    	exit $?
    }
    
    [ $num -eq 3 ] && {
    	echo "Bye~"
    	exit 4
    }
    

3.循环

1.for

  • 语法
    for var in list
    do
    	commands
    done
    
  • 支持C语言风格
    for (( i=1;i<=10;i++ ))
    do
    	echo "The next number is $i"
    done
    

2.while

  • 语法:此处的test commandif-else语句格式一样,可以使用任何的bash命令

    • 注意whiletest command的退出状态码,必须随着循环⾥的命令改变,否则状态码如果不变化,循环会不停⽌的继续下去
      while test command
      do
      	commands
      done
      
  • while命令可以写入多个测试命令

    • 只有最后一个测试命令的退出状态码会被决定是否退出循环
    • 注意换行,多个测试命令要单独的出现在每一行
      var1=10
      while echo $var1
      	[ $var1 -ge 0 ]
      do
      	echo "This is inside the loop"
      	var1=$[ $var1 -1 ]
      done
      

3.until命令

  • untilwhile相反的语意until命令要求你指定⼀个返回⾮零退出码的测试命令
    • 只有退出状态码不是0,bash才会执⾏循环的命令
  • 语法
    until test commands
    do
    	other commands
    done
    
  • until⽀持多个测试命令,只有最后⼀个决定bash是否执⾏其他命令
    until echo $var1
    	[ $var1 -eq 0 ]
    do
    	echo "Inside the loop:$var1"
    	var1=$[ $var1 - 25 ]
    done
    

4.控制循环

1.break

  • 作用:强制退出任意类型的循环
    • 跳出多个循环时,break会自动终止所在的最内存循环
  • 终止外层循环n表示跳出的循环层级,默认是1,下一层就是2
    break n
    

2.continue

  • 作用:跳过某次循环,直接去本次循环的判断部分

5.处理循环的输出

  • 在shell脚本⾥,循环输出后的结果,可以进⾏输出重定向
    for (( a = 1;a<10;a++ ))
    do
    	echo "The number is $a"
    done > test.txt
    echo "Finished"
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/793684.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARM功耗管理标准接口之SCMI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理有哪些标准接口&#xff1f;ACPI&PSCI&SCMI&#xff1f; Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface 下图示例说明了实现…

MongoDB教程(一):Linux系统安装mongoDB详细教程

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、Ubuntu…

昇思25天学习打卡营第23天|基于MindSpore通过GPT实现情感分类

1. 学习内容复盘 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14 I…

一文入门【NestJs】Modules

&#x1f6a9;引言 在探索NestJS的生态系统时&#xff0c;理解模块&#xff08;Modules&#xff09;的概念是至关重要的第一步。NestJS&#xff0c;作为一个基于Node.js的现代框架&#xff0c;借鉴了Angular的模块化设计思路&#xff0c;为开发者提供了一种优雅的方式来组织和…

jenkins打包java项目报错Error: Unable to access jarfile tlm-admin.jar

jenkins打包boot项目 自动重启脚本失败 查看了一下项目日志报错&#xff1a; Error: Unable to access jarfile tlm-admin.jar我检查了一下这个配置&#xff0c;感觉没有问题&#xff0c;包可以正常打&#xff0c; cd 到项目目录下面&#xff0c;手动执行这个sh脚本也是能正常…

vue中el-table单元格复制功能

一、单页面中使用 1.在el-table上绑定单击事件 cell-click“copyText” 或双击事件 cell-dblclick“copyText” 注&#xff1a;cell-dblclick函数有四个参数&#xff0c;分别是row, column, cell, event&#xff1b; row&#xff1a;可看到被其操作单元格所在行的所有的数据&…

电力需求预测挑战赛笔记 Taks1 跑通baseline

#AI夏令营 #Datawhale #夏令营 赛题 一句话介绍赛题任务可以这样理解赛题&#xff1a; 【训练时序预测模型助力电力需求预测】 电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。 赛题任务 给定多个房屋对应电力消耗历史 N 天的相关序列数…

广度优先(BFS)

先看一道简单的题&#xff0c;迷宫问题&#xff1a; 洛谷P1746 离开中山路&#xff1a;P1746 离开中山路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<iostream> #include<cstring> #include<queue> #include <utility> #define N 1002 …

深度学习编码解码结构-以及kreas简单实现

图像分割中的编码解码结构&#xff08;Encoder-Decoder Model&#xff09;是一种广泛应用的网络架构&#xff0c;它有效地结合了特征提取&#xff08;编码&#xff09;和分割结果生成&#xff08;解码&#xff09;两个过程。以下是对图像分割中编码解码结构的详细解析&#xff…

链路聚合概述

技术背景&#xff1a; 随着网络规模不断扩大&#xff0c;人们对骨干链路的带宽吞吐量与可靠性提出了越来越高的要求。根据传统的方案&#xff0c;只能将当前链路更换为更高速的链路。但是更换链路需要付出较高的成本费用&#xff0c;而且灵活性差&#xff0c;因此我们需要探索…

旷野之间4 - 100 个 Kubernetes 面试问题及答案

100 个 Kubernetes 面试问题及答案 Kubernetes 简介 什么是 Kubernetes&#xff1f; Kubernetes 是一个开源容器编排平台&#xff0c;可自动部署、扩展和管理容器化应用程序。 什么是容器&#xff1f; 容器是一个轻量级、独立的、可执行软件包&#xff0c;其中包含运行应用…

ctfshow-web入门-文件上传(web166、web167)(web168-web170)免杀绕过

目录 1、web166 2、web167 3、web168 4、web169 5、web170 1、web166 查看源码&#xff0c;前端只让传 zip 上传 zip 成功后可以进行下载 随便搞一个压缩包&#xff0c;使用记事本编辑&#xff0c;在其内容里插入一句话木马&#xff1a; 上传该压缩包&#xff0c;上传成功…

SSL 证书错误:如何修复以及错误发生的原因

SSL证书可以提升网站的可信度。然而&#xff0c;如果您的SSL证书出现错误&#xff0c;您可能会得到一个“不安全”的标签&#xff0c;这可能会导致访问者失去对您网站的信任并转向竞争对手。 本文将介绍SSL证书错误的原因及其对用户的潜在影响。随后&#xff0c;我们将提供详细…

Proteus + Keil单片机仿真教程(六)多位LED数码管的动态显示

上一节我们通过锁存器和八个八位数码管实现了多个数码管的静态显示,这节主要讲解多位数码管的动态显示,所谓的动态显示就是对两个锁存器的控制。考虑一个问题,现在给WS位锁存器增加一个循环,让它从1111 1110到0111 1111会发生什么事情?话不多说,先上代码: #include<…

stm32——AD采集以及DMA

今天继续我们的STM32的内容学习&#xff0c;我使用的单片机是STM32F103VCT6,通过Keil Array Visualization软件来观测AD采样出来的波形。先来看看本次实验用到的硬件知识。 首先是ADC&#xff08;Analog-to-Digital Converter&#xff09;是模拟信号转数字信号的关键组件&#…

网络编程!

网络编程 【1】网络开发架构 &#xff08; 1 &#xff09; C / S 架构 C : client &#xff08;客户端&#xff09; S: server (服务端) APP - 就是服务端 C/S 架构通过客户端软件和服务器之间的交互&#xff0c;实现了前端界面和后端业务逻辑的分离&#xff0c;提供了一种…

电脑 DNS 缓存是什么?如何清除?

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的重要组成部分&#xff0c;负责将人类易记的域名转换为机器可读的 IP 地址&#xff0c;从而实现网络通信。DNS 缓存是 DNS 系统中的一个关键机制&#xff0c;通过临时存储已解析的域名信息&#xf…

filex用户手册中文版解读

filex用户手册 filex的用户手册&#xff0c;看着好头疼呢&#xff0c;主要是没有&#x1f58a;记录&#xff0c;感觉就是浮在空中&#xff0c;飘在天上&#xff0c;好像懂了&#xff0c;又好像啥也没了解到&#xff0c;哈哈&#xff0c;有点意思。为了解决这个bug&#xff0c;…

力扣-回溯法

何为回溯法&#xff1f; 在搜索到某一节点的时候&#xff0c;如果我们发现目前的节点&#xff08;及其子节点&#xff09;并不是需求目标时&#xff0c;我们回退到原来的节点继续搜索&#xff0c;并且把在目前节点修改的状态还原。 记住两个小诀窍&#xff0c;一是按引用传状态…

阿里云Linux中安装MySQL,并使用navicat连接以及报错解决

首先查询是否安装MySQL // linux 使用yum安装或者rpm安装。(就是一个安装工具类似于applStore&#xff0c;brew不必在意) // 区别&#xff1a;yum会自动安装你要安装的东西的其他依赖&#xff0c;rpm不会但会提示你需要安装的东西&#xff0c;比较麻烦&#xff0c;所以采用yum安…