当前位置: 首页 > news >正文

shell 命令拓展二——流程控制

文章目录

  • 前言
  • 一、“if else”条件语句
    • 1.1 if 格式:单支
    • 1.2 if 格式:双支
    • 1.3 if 格式:多支
  • 二、for 循环
    • 2.1 for循环概述
    • 2.2 for循环的两种方式
      • 2.2.1 常用于数值方面的处理
      • 2.2.2 遍历列表
  • 三、while 循环
    • 3.1描述
    • 3.2 案例
  • 四、case
    • 4.1 case描述
    • 4.2 案例
      • 4.2.1 案例1:使用case进行服务控制
      • 4.2.2 案例2:用 case 编写一个查看 cpu 内存 硬盘 资源使用情况
  • 总结
      • Shell 流程控制概述
      • 条件判断(if else)
        • 单支 if 结构
        • 双支 if-else 结构
        • 多支 if-elif-else 结构
      • 循环结构(for 循环)
        • 数值处理循环
        • 遍历列表循环
      • while 循环
      • 实际应用


前言

在 shell 脚本中,流程控制是编写复杂自动化任务的核心。通过条件判断、循环和选择结构,可以实现逻辑分支和重复操作。


一、“if else”条件语句

任何程序都有默认的执行流程,通常是 从上向下 逐行依次执行。

#!/bin/bash #先执行的第1行
num=100 #第2行
((num++)) #第3行
echo $num #第4行
.........

要控制程序的默认执行流程,可以使用流程控制语句:

  • 选择结构:选择性执行特定代码段

  • 循环结构:重复执行代码段,直到满足终止条件(通过条件控制循环次数)

  • Shell提供了多种判断方式,支持对数字、字符串和文件的操作。

1.1 if 格式:单支

if [ 条件 ]then
命令
fi

执行机制:判断一次,仅有一个结果

  • 条件成立(true):执行命令
  • 条件失败(false):没有任何执行

示例:

#!/bin/bash
num1=$1  #第一个参数赋值给num1
num2=$2
if [ $num1 -gt $num2 ]; thenecho "$num1 大于 $num2"
fi## 执行shell程序
./ifdemo.sh 6 1

在这里插入图片描述
案例1:ls /mnt 如果执行成功,输出 it’s OK

#!/bin/bash
if ls /mnt  # ls /mnt执行成功,输出 it's OK
thenecho " it's OK"
fi

在这里插入图片描述

1.2 if 格式:双支

if [ 条件 ]; then
命令1…
else
命令2…
fi

执行机制:判断一次条件,有两个不同结果

  • 条件成立(true):执行 then 后面的代码(命令1)
  • 条件失败(false):执行 else 后面的代码(命令2)
#!/bin/bash
num1=$1  #第一个参数赋值给num1
num2=$2
if [ $num1 -qt $num2 ]; thenecho "$num1 大于 $num2"
elseecho "$num1 小于 $num2"
fi

分别执行sh hello.sh 10 5和.sh hello.sh 5 10查看结果
在这里插入图片描述

1.3 if 格式:多支

if [ 条件1 ]; then
命令1…
elif [ 条件2 ]; then
命令2
......elif
else
默认命令…
fi

执行机制:系统会依次检查多个判断条件,一旦某个条件成立,则执行对应的操作并终止后续判断;若所有条件均不满足,则执行默认操作。

例如,若第1个条件成立,则仅执行命令1,跳过其余条件判断。

示例1:

#!/bin/bash
read -p "请输入您的分数" score
if [ $score -ge 90 ]; thenecho "优秀"  # 分数>=90 优秀
elif [ $score -ge 80 ]; thenecho "良好"  # 80<=分数<90 良好
elif [ $score -ge 60 ]; thenecho "及格"
elseecho "不及格"
fi
# 执行脚本
./ifdemo.sh

在这里插入图片描述

示例2:判断输入数字是奇数还是偶数

#!/bin/bash
read -p "请输入一个整数" num
if [ $[num % 2] -eq 0 ]; thenecho "$num 是偶数"
elseecho "$num 是奇数"
fi

在这里插入图片描述
案例3:根据时间判断时间段

#!/bin/bash
#1、定义时间变量
a=$(date +%H)
#2、定义时间段  早上
if [ $a -ge 6 -a $a -lt 11 ];thenecho "现在时间是早上$a点"
#3、定义时间段 中午
elif [ $a -ge 11 -a $a -lt 13 ];thenecho "现在时间是中午$a点"
#4、定义时间段 下午
elif [ $a -ge 13 -a $a -lt 18 ];thenecho "现在时间是下午$a点"
#5、定时间段 晚上
elif [ $a -ge 18 -a $a -lt 24 ];thenecho "现在时间是晚上$a点"
else echo "现在时间是凌晨 $a 点"
f

在这里插入图片描述
在这里插入图片描述

二、for 循环

2.1 for循环概述

循环流程控制:程序在执行时重复性的执行某行或某段代码。
不能出现死循环现象(在循环中添加条件用于在某个时刻结束循环)
一个简单的循环必须具备:

  • 循环初始值
  • 循环条件
  • 修改循环条件
# for循环格式
for((循环初始值; 循环条件; 修改循环条件))
do循环体代码(会重复执行的程序代码)
done

2.2 for循环的两种方式

2.2.1 常用于数值方面的处理

# for循环格式
for((循环初始值; 循环条件; 修改循环条件))
do循环体代码(会重复执行的程序代码)
done

解释:
初始值:即循环初始值。例如:i=1
限制值:即循环条件。例如:i<=5
执行步长:即循环初始值修改。例如:i++

案例1:
实现打印5次HelloWorld
在这里插入图片描述
案例2:
十以内数值的累加
在这里插入图片描述
在这里插入图片描述

2.2.2 遍历列表

for var in con1 con2 con3 …
doecho $var
done

循环流程:

  • 第一次循环时,$var的内容是con1
  • 第二次循环时,$var的内容是con2
  • 第三次循环时,$var的内容是con3

也可以写成:

for N in 1 2 3; do echo $N; done
或者
for N in {1..3}; do echo $N; done

案例3
打印动物名称

#!/bin/bash
for animal in cat dog elephant
doecho ${animal}
done

在这里插入图片描述
案例4:
把指定目录下所有的文件名打印出来

#!/bin/bash
###查询/opt/shellodemo目录下所有的文件名,并赋值给filelist变量
filelist=$(ls /opt/shelldemo)
###循环遍历filelist,获取每一个文件名
for filename in $filelist
do#输出文件名echo "$filename"
done

在这里插入图片描述
案例5:
统计 /var/log 有多少文件并显示文件名

#!/bin/bashcd /var/log
count=0
for file in $(ls -R *)
doif [ -f "$file" ]; thenecho "文件名:$file"((count++))fi
done
echo "文件总数量:$count"

在这里插入图片描述

三、while 循环

3.1描述

while 循环是编程中最基础的控制结构之一,它允许程序在某个条件成立的情况下重复执行一段代码块。

方式一:

while [ expression ]
docommand…修改while中的循环条件
done

示例:

#!/bin/bash
###演示while循环的第一种方式
while [ "$y" != "yes" -a "$y" != "YES" ]
doecho "请输入yes/YES停止循环:"read y ##接收键盘录入的值
done
echo "循环停止了!";

在这里插入图片描述
方式二:

i=1
while((i<=3))
doecho $ilet i++ # (($i++))
done

在这里插入图片描述
注:let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。

  • 自加操作: let no++
  • 自减操作: let no–

3.2 案例

案例1:
计算10以内数值的累加和

#!/bin/bash
count=0  # 记录累加值结果
num=1    # 循环初始值
while ((num<=10))
docount=$[count+num]# ((num++))# 使用let命令,计算变量++let num++
done
echo "10以内数值的累加和:${count}";

在这里插入图片描述
案例2:
while死循环

#!/bin/bash
###演示while死循环,如果输出yes退出循环
while true
doecho "请输入字符串:"read y
if [ "$y" == "yes" ]; thenexit 0 ##退出#或者使用break
fi
done

在这里插入图片描述

四、case

4.1 case描述

ase语句是一种条件控制结构,用于根据不同的条件值执行对应的代码块,常用于简化多分支判断逻辑。

case $变量名称 in
匹配模式1)程序段
;; # 匹配模式1执行完毕匹配模式2)程序段
;;*) # 默认值,没有匹配的模式程序段
;;
esac # 代表case语句结束

示例:
在这里插入图片描述

在这里插入图片描述

4.2 案例

4.2.1 案例1:使用case进行服务控制

#!/bin/bash
case $1 in 
"start")
systemctl start httpd 
echo "启动服务"
;;"stop")
systemctl stop httpd
echo "httpd服务已关闭"
;;"restart")
systemctl stop httpd 
systemctl start httpd
echo "服务已重启"
;;*)
echo "请你输入正确值: {start|stop|restart}"
;;
esac

在这里插入图片描述
在这里插入图片描述

4.2.2 案例2:用 case 编写一个查看 cpu 内存 硬盘 资源使用情况

#!/bin/bash#提示用户选择查看信息
echo "请选择查看的系统信息:"
echo "1. CPU 使用情况"
echo "2. 内存 使用情况"
echo "3. 硬盘 使用情况"
echo "4. 退出"#用户交互
read -p "请输入选项(1/2/3/4):" numcase $num in 
"1")echo "正在查看CPU使用情况..........."top -bn1| grep "Cpu(s)"
;;"2")
echo "正在查看内存使用情况..........."free -h
;;"3")
echo "正在查看硬盘使用情况..........."df -h
;;"4")
echo "退出程序"exit 0
;;
*)
echo "请输入整数值:1、2、3、4。其他无效"
;;
esac

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

Shell 流程控制概述

Shell 脚本中的流程控制是实现复杂自动化任务的基础,主要包括条件判断和循环结构。通过流程控制,可以实现逻辑分支和重复操作,从而编写出高效且灵活的脚本。

条件判断(if else)

条件判断允许根据不同的条件执行不同的代码块。Shell 提供了多种判断方式,支持对数字、字符串和文件的操作。

单支 if 结构

仅判断一次条件,条件成立时执行相应命令,失败则不执行。

双支 if-else 结构

判断一次条件,条件成立时执行命令1,失败时执行命令2。

多支 if-elif-else 结构

依次检查多个条件,一旦某个条件成立,则执行对应代码块并终止后续判断;若所有条件均不满足,则执行默认操作。

循环结构(for 循环)

循环结构用于重复执行某些代码块,Shell 提供了两种 for 循环方式。

数值处理循环

通过初始值、循环条件和修改循环条件来控制循环次数,常用于数值计算和固定次数的重复操作。

遍历列表循环

通过遍历一组值(如文件列表、字符串等)来执行循环,适用于处理集合或动态数据。

while 循环

while 循环在条件成立时重复执行代码块,直到条件不满足为止。它支持两种方式:

  1. 通过条件表达式控制循环。
  2. 通过数值条件控制循环。

实际应用

条件判断和循环结构在 Shell 脚本中广泛应用,例如:

  • 根据分数判断等级。
  • 判断奇偶数。
  • 打印指定目录下的文件名。
  • 统计文件数量。
  • 实现用户交互式的循环控制。
http://www.dtcms.com/a/360661.html

相关文章:

  • springboot项目启动时打印maven打包时间
  • 华秋DFM检查PCB设计缺陷、一键导出Gerber、BOM、坐标文件
  • 平面椭圆转化为三阶Bezier曲线的方法
  • 目标检测算法YOLOv4详解
  • cloudflare 负载均衡器介绍
  • 用 MATLAB 实现遗传算法求解一元函数极值:从代码到实践
  • JS实现默认显示部分文字点击按钮显示全部内容
  • 使用组合子构建抽象语法树
  • 24数学建模国赛C
  • Linux性能调试工具之ftrace
  • 【开题答辩全过程】以 基于Java的城市公交查询系统设计与实现为例,包含答辩的问题和答案
  • 元宇宙与旅游产业:虚实融合的文旅新体验
  • 【代码随想录day 21】 力扣 216.组合总和III
  • 【代码随想录day 22】 力扣 39. 组合总和
  • 2025年跨领域职业发展证书选择指南
  • 设计模式:外观模式(Facade Pattern)
  • [线上问题排查]深度剖析:一条MySQL慢查询的全面优化实战
  • 操作文件 File类
  • Linux网络编程04:网络基础(万字图文解析)
  • Day19_【机器学习—线性回归 (2)】
  • 【大模型记忆-Mem0详解-1】概述
  • springboot整合minio实现上传下载搭建minio
  • 【CVPR24-工业异常检测】InCTRL:少样本基于上下文残差学习的通才异常检测
  • 安装pthread man手册
  • 决策思维研究体系主要构成
  • B 站 “成分” 检测工具,深挖历史记录,秒测二次元浓度
  • OWASP Top 10漏洞详解
  • MCP(Model Context Protocol,模型上下文协议)介绍
  • 图像质量评价——结构相似度
  • CVPR上的多模态检索+视频理解,LLM助力提效翻倍