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

news2025/4/7 0:28:37

目录

  • 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.coloradmin.cn/o/1919809.html

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

相关文章

Java技术栈总结:容器集合篇

一、List 1、ArrayList &#xff08;1&#xff09;底层数据结构 底层数据结构为数组。数组是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 Q&#xff1a;为什么数组索引下标从0开始&#xff1f; A&#xff1a;从0开始&#xff0c;对应寻址公式&#xff1a;a[i]…

FLStudio21.3.12中文破解版本安装包win+mac电脑安装包下载

&#x1f3a4; FL Studio 21中文版&#xff1a;音乐制作新宠&#xff0c;让你的创作起飞&#xff01; 嗨&#xff0c;亲爱的音乐创作者们&#xff01;&#x1f44b;今天要和大家分享一个让我超级兴奋的宝藏软件——FL Studio 21中文版&#xff01;这不仅仅是一款音乐制作软件&…

科研绘图系列:R语言金字塔图(pyramid plot)

介绍 金字塔图(Pyramid chart)是一种用于展示人口统计数据的图表,特别是用于展示不同年龄段的人口数量。这种图表通常用于展示人口结构,比如性别和年龄的分布。 特点: 年龄分层:金字塔图按年龄分层,每一层代表一个年龄组。性别区分:通常,男性和女性的数据会被分别展…

Linux命令-grep/wc/管道符

1、Linux命令-grep/wc/管道符 2、echo/tail/重定向符 3、vi/vim 编辑器

有哪些好用的考勤管理系统?

&#x1f308; 对于企业而言&#xff0c;考勤管理不仅仅是支持员工工资计算&#xff0c;还会对实际的运营产生很大影响。一个好用的考勤管理系统能够实现考勤数据的实时采集和管理&#xff0c;保证考勤数据的稳定运行&#xff0c;从而实现复杂的工作安排&#xff0c;有效降低人…

uniapp上架到appstore遇到的问题

1、appstore在美国审核&#xff0c;需要把服务器接口的国外访问权限放开 2、登陆部分 a、审核时只能有密码登陆&#xff0c;可以通过接口响应参数将其他登陆方式暂时隐藏&#xff0c;审核成功后放开即可 b、需要有账号注销功能 3、使用照相机和相册功能时需要写清楚描述文案

具有 0.5V 超低输入电压的 3A 升压转换器TPS61021

1 特性 输入电压范围&#xff1a;0.5V 至 4.4V 启动时的最小输入电压为 0.9V 可设置的输出电压范围&#xff1a;1.8V 到 4.0V 效率高达 91%&#xff08;VIN 2.4V、VOUT 3.3V 且 IOUT 1.5A 时&#xff09; 2.0MHz 开关频率 IOUT > 1.5A&#xff0c;VOUT 3.3V&#xff08;V…

OSINT 项目:以太坊可视化工具

KennBro &#xff0c; iKy的开发者&#xff0c;正在构建一个令人兴奋的新工具。 他使用来自Etherscan区块浏览器的信息为以太坊创建了一个可视化浏览器。 使用免费的 API 密钥和此工具&#xff0c;您可以直观地了解交易和钱包。 我还没有时间自己安装它来测试它&#xff0c;…

Simscape物理建模步骤

为了介绍构建和仿真物理模型的步骤&#xff0c;这里以simulink自带示例模型Mass-Spring-Damper with Controller为例&#xff0c;下图为建立好的模型。 详细物理建模和仿真分析步骤如下&#xff1a; 步骤 1&#xff1a;使用 ssc_new 创建新模型 使用 ssc_new 是开始构建 Sims…

linux系统操作/基本命令/vim/权限修改/用户建立

Linux的目录结构&#xff1a; 一&#xff1a;在Linux系统中&#xff0c;路径之间的层级关系&#xff0c;使用:/来表示 注意:1、开头的/表示根目录 2、后面的/表示层级关系 二&#xff1a;在windows系统中&#xff0c;路径之间的层级关系&#xff0c;使用:\来表示 注意:1、D:表示…

职业本科计算机网络实训室

一、职业本科计算机网络实训室建设的背景 随着数字化时代的深入发展&#xff0c;计算机网络技术已经渗透到社会的每一个角落&#xff0c;成为推动社会进步的重要力量。在《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》中&#xff0c;建设数字中国…

2972.力扣每日一题7/11 Java(击败100%)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 解题思路 解题方法 时间复杂度 空间复杂度 Code 解题思路 该问…

vscode编译环境配置-c++

1. 支持跳转 安装c/c扩展 安装后即可支持跳转

Elasticsearch:介绍 retrievers - 搜索一切事物

作者&#xff1a;来自 Elastic Jeff Vestal, Jack Conradson 在 8.14 中&#xff0c;Elastic 在 Elasticsearch 中引入了一项名为 “retrievers - 检索器” 的新搜索功能。继续阅读以了解它们的简单性和效率&#xff0c;以及它们如何增强你的搜索操作。 检索器是 Elasticsearc…

还不懂 OOM ?详解内存溢出与内存泄漏区别!

内存溢出与内存泄漏 1. 内存溢出&#xff08;Out Of Memory&#xff0c;OOM&#xff09; 概念&#xff1a; 内存溢出是指程序在运行过程中&#xff0c;尝试申请的内存超过了系统所能提供的最大内存限制&#xff0c;并且垃圾收集器也无法提供更多的内存&#xff0c;导致程序无…

深入浅出Ansiable

目录 Ansible的起源 Ansible的发展史 Ansible的功能 Ansible的特性 Ansible的架构 Ansible的注意事项 Ansible入门 Ansible的安装 Ansible配置文件 配置文件解析 inventory主机配置清单 Ansible相关工具 Ansible的常用模块 Command模块 shell模块 Script模块 C…

Windows 电脑查看 WiFi 密码的方法都有哪些?

从设置面板中查看 当你使用的是笔记本电脑并且连接 WiFi 之后可以在设置面板中查看 WiFi 密码&#xff0c;首先打开设置界面&#xff0c;然后点击网络和 Internet&#xff0c;找到 WiFi 之后点击进入&#xff0c;然后点击管理已知网络。 然后点击已经连接好的无线网络。 进入之…

快速导入mysql百万用户数据

1. 前言 随着互联网的发展,大数据已经是很普遍的一个现象,已不再是零几年时的神话。数据资源意为着就是信息资源,很好的使用起来说是财富资源一点也不夸张.所以无论当下是小的还是大的互联网公司都会遇到大数的情况。只不过不同的业务逻辑需求与使用情况不一样罢了。 大数据我…

git为文件添加可执行权限

查看文件权限 git ls-files --stage .\SecretFinder.py100644 表示文件的所有者有读取和写入权限 添加可执行权限 git update-index --chmod x .\SecretFinder.py再次查看文件权限 git ls-files --stage .\SecretFinder.py100755 表示文件的所有者有读取、写入和执行权限

安卓逆向经典案例——XX优品(uniapp)

uni-app逆向 uniapp的目录结构 有一个io文件夹&#xff0c;下面有dcloud uniapp UniApp 可以用于开发 H5 应用&#xff0c;但它不仅仅局限于 H5 应用。UniApp 的特点包括&#xff1a; 1. 跨平台&#xff1a;可以一套代码同时生成适用于多个平台&#xff08;如 iOS、Android、…