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

2.if-then-else

  • 语法
    if command
    thencommand
    elsecommand
    fi
    

3.elif

  • 语法
if command
thencommand
elif command
thencommand
fi

4.case

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

5.实际上手

  • 内存监控
    #!/bin/bashFreeMem=`free -m | awk 'NR==2 {print $NF}'`
    CHARS="Current memory is $FreeMem"if [ "$FreeMem" -lt 16000 ]
    thenecho $CHARSecho "内存不足,抓紧维护服务器!"
    fi
    
  • 读取比较大小
    • 单分支版本
      #!/bin/basha=$1
      b=$2if [ $a -lt $b ]
      thenecho "Yes, $a less than $b"exit 0
      fiif [ $a -eq $b ]
      thenecho "Yes, $a equal $b"exit 0
      fiif [ $a -gt $b ]
      thenecho "Yes, $a greater than $b"exit 0
      fi
      
    • 多分支版本
      #!/bin/basha=$1
      b=$2if [ $a -lt $b ]
      thenecho "Yes, $a less than $b"exit 0
      elif [ $a -eq $b ]
      thenecho "Yes, $a equal $b"exit 0
      else [ $a -gt $b ]echo "Yes, $a greater than $b"exit 0
      fi
      
  • MySQL监控脚本
    #!/bin/bashif [ `netstat -tunlp | grep mysql | wc -l` -ge "1" ]
    thenecho "MySQL is running"
    elseecho "MySQL is stopped"# systemctl start mysql.service
    fi
    
  • Rsync启动脚本
    #!/bin/bashif [ "$#" -ne 1 ]
    thenecho "Usage: $0 {start|stop|restart}"exit 1
    fiif [ "$1" = "start" ]
    then/usr/bin/rsync --daemonsleep 2if [ `netstat -tunlp | grep rsync | wc -l` -ge 1 ]thenecho "Rsync is started"exit 0fi
    elif [ "$1" = "stop" ]
    thenkillall rsync &>/dev/nullsleep 2if [ `netstat -tunlp | grep rsync | wc -l` -eq 0 ]thenecho "Rsync is stopped"exit 0fi
    elif [ "$1" = "restart" ]
    thenkill rsyncsleep 1killpro=`netstat -tunlp | grep rsync | wc -l`/usr/bin/rsync --daemonsleep 1startpro=`netstat -tunlp | grep rsync | wc -l`if [ "$killpro" -eq 0 -a "$startpro" -ge 1 ]thenecho "Rsync is restarted"exit 0fi
    elseecho "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/bashread -p "Pls input a char:> " var1[ "${var1}" -eq 1 ] && {echo ${var1}exit 0
    }[ "$var1" -eq 2 ] && {echo $var1exit 0
    }[ "$var1" -ne "1" -a "$var1" -ne "2" ] && {echo "Script Error"exit 1
    }
    
  • 模拟安装脚本
    #!/bin/bashpath=/scripts[ ! -d "$path" ] && mkdir -p scriptscat << END1.[install lamp]2.[install inmp]3.[exit]
    ENDread -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.shexit $?
    }[ $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.shexit $?
    }[ $num -eq 3 ] && {echo "Bye~"exit 4
    }
    

3.循环

1.for

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

2.while

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

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

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

3.until命令

  • untilwhile相反的语意until命令要求你指定⼀个返回⾮零退出码的测试命令
    • 只有退出状态码不是0,bash才会执⾏循环的命令
  • 语法
    until test commands
    doother commands
    done
    
  • until⽀持多个测试命令,只有最后⼀个决定bash是否执⾏其他命令
    until echo $var1[ $var1 -eq 0 ]
    doecho "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++ ))
    doecho "The number is $a"
    done > test.txt
    echo "Finished"
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据------JavaWeb------VueElement(完整知识点汇总)

Vue 定义 Vue是一套前端框架&#xff0c;可以免除原生JavaScript中的DOM操作&#xff0c;简化书写 之前所学的MyBatis框架是用来简化JDBC代码编写的&#xff1b;而Vue是前端框架&#xff0c;用来简化JavaScript代码编写的 在Axios与JSON综合案例的添加中有大量的DOM操作&#…

Ubuntu 22.04.4 LTS (linux) 安装 Auditd 安全审计

1 安装auditd sudo apt update sudo apt-get install auditd 2 修改配置 #sudo vim /etc/audit/auditd.conf #日志文件位置 log_file /var/log/audit/audit.log #日志文件大小(Mb) max_log_file 8 #日志文件数量 num_logs 53 启动服务 sudo systemctl restart aud…

【密码学】数字签名

一、数字签名的基本概念 数字签名是一种用于验证电子文档完整性和身份认证的密码学技术。它通过使用公钥加密体系中的私钥对文档的一部分&#xff08;通常是文档的摘要&#xff09;进行加密&#xff0c;从而创建一个“签名”。这个签名可以附在文档上&#xff0c;或作为一个单独…

如何将HEVC格式的视频转换为无损、未压缩的MP4格式视频?

在和大家分享视频格式转换之前&#xff0c;先跟大家分享一下HEVC格式的视频到底是什么文件&#xff1f;压缩原理是什么&#xff1f;了解了它的本质之后&#xff0c;我们就可以知道如何保证视频高清无损了。 如何将HEVC格式的视频转换为无损、未压缩的MP4格式视频&#xff1f; …

逐步实践复现 SELF-RAG

SELF-RAG 简介 SELF-RAG&#xff08;Self-Reflective Retrieval-Augmented Generation&#xff09;是一种检索增强生成&#xff08;RAG&#xff09;的框架&#xff0c;它通过自我反思学习检索、生成和批判&#xff0c;以提高大型语言模型&#xff08;LLM&#xff09;的质量和真…

通用业务指标管理系统设计

设计一个通用业务指标管理系统&#xff0c;旨在帮助企业全面监控和管理关键业绩指标(KPIs)&#xff0c;以驱动决策制定和业务优化。以下是一个综合性的设计方案&#xff0c;涵盖核心功能模块、技术架构、以及用户体验设计要点&#xff1a; 1. 核心功能模块 目标设定与分解 战…

「C++系列」一篇文章说透【存储类】

文章目录 一、C 存储类1. 类的定义2. 对象的创建3. 对象在内存中的布局4. 对象的存储位置 二、auto 存储类1. auto的基本用法2. auto与存储类的关系1) 自动存储类&#xff08;最常见的&#xff09;2) 静态存储类3) 动态存储类&#xff08;通过new&#xff09; 三、register 存储…

C标准库读写文件

函数介绍 库变量 变量描述size_t无符号整数类型&#xff0c;是sizeof关键字的结果&#xff0c;表示对象大小FILE文件流类型&#xff0c;适合存储文件流信息的对象类型 库宏 宏描述NULL空指针常量EOF表示已经到达文件结束的负整数stderr、stdin、stdout指向FILE类型的指针&a…

【数智化案例展】吉林省消防救援总队——基于大语言模型的119智慧助手

‍ 嘉诚信息案例 本项目案例由嘉诚信息投递并参与数据猿与上海大数据联盟联合推出的《2024中国数智化转型升级创新服务企业》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着信息时代的迅猛发展&#xff0c;消防人员正面临前所未有的知识爆炸挑战。为了高…

day30--56. 合并区间+ 738.单调递增的数字

一、56. 合并区间 题目链接&#xff1a;https://leetcode.cn/problems/merge-intervals/ 文章讲解&#xff1a;https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1wx4y157nD 1.1 初见思路 …

数据库第四次练习

数据准备 创建两张表&#xff1a;部门&#xff08;dept&#xff09;和员工&#xff08;emp&#xff09;&#xff0c;并插入数据&#xff0c;代码如下 create table dept( dept_id int primary key auto_increment comment 部门编号, dept_name char(20) comment 部门名称 ); in…

SAP PS学习笔记02 - 网络,活动,PS文本,PS文书(凭证),里程碑

上一章讲了PS 的概要&#xff0c;以及创建Project&#xff0c;创建WBS。 SAP PS学习笔记01 - PS概述&#xff0c;创建Project和WBS-CSDN博客 本章继续讲PS的后续内容。包括下面的概念和基本操作&#xff0c;以及一些Customize&#xff1a; - 网络&#xff08;Network&#xf…

力扣-回溯法

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

欣奇随机美图源码

欣赏养眼美图让人心情愉悦 新增正能量进站引导首页 上传文件解压即可用有手就行 美图输出接口自判断版 http://mt.xqia.net/api.php http://mt.xqia.net/api.php?typejson 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89520368 更多资源下载&…

20240711每日消息队列-------------MQ消息的积压的折磨

目标 解决MQ消息的积压 背景 菜馆系统----------- 系统读取消息&#xff0c;处理业务逻辑&#xff0c;持久化订单和菜品数据&#xff0c;然后将其显示在菜品管理客户端上。 最初我们的用户基数很小&#xff0c;上线后的一段时间内&#xff0c;MQ消息通信还算顺利。 随着用户…

R包:‘ggcharts好看线图包‘

介绍 ggcharts提供了一个高级{ggplot2}接口&#xff0c;用于创建通用图表。它的目标既简单又雄心勃勃:让您更快地从数据可视化的想法到实际的绘图。所以如何?通过处理大量的数据预处理&#xff0c;为您模糊{ggplot2}细节和绘图样式。生成的图是ggplot对象&#xff0c;可以使用…

蓝桥 7.11 dp

2.砝码称重 - 蓝桥云课 (lanqiao.cn) 思路 动态规划的核心思想是将问题分解成更小的子问题&#xff0c;并存储子问题的解&#xff0c;以避免重复计算 数组 dp[i][j] 表示使用前 i 个砝码可以称出的重量为 j 的数量 更新过程如下&#xff1a; 1.初始化&#xff1a;dp[0][0] …

python:sympy 求解一元五次方程式

pip install sympy 或者 本人用的 anaconda 3 自带 sympy 在北大数学训练营&#xff0c;韦东奕 用卡丹公式 巧妙 求解一元五次方程式&#xff1a; \latex $x^510*x^320*x-4 0$ from sympy import *x symbols(x) expr x**5 10*x**3 20*x -4# 用卡丹公式 尝试化简 a sym…

【IOS】React Native之HelloWorld

RN搭建开发环境 rvm 安装3.2.2 brew install node18 brew install watchman# 使用nrm工具切换淘宝源 npx nrm use taobao# 如果之后需要切换回官方源可使用 npx nrm use npmnpm install -g yarnbrew install cocoapodsnpm uninstall -g react-native-cli react-native-communi…

<数据集>表情识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2504张 标注数量(xml文件个数)&#xff1a;2504 标注数量(txt文件个数)&#xff1a;2504 标注类别数&#xff1a;7 标注类别名称&#xff1a;[Neutral, Happy, Angry, Fear, Sad, surprised, Disguist] 序号类别名…