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


前言

在 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 ]; then
	echo "$num1 大于 $num2"
fi

## 执行shell程序
./ifdemo.sh 6 1

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

#!/bin/bash
if ls /mnt  # ls /mnt执行成功,输出 it's OK
then
	echo " 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 ]; then
	echo "$num1 大于 $num2"
else
	echo "$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 ]; then
	echo "优秀"  # 分数>=90 优秀
elif [ $score -ge 80 ]; then
	echo "良好"  # 80<=分数<90 良好
elif [ $score -ge 60 ]; then
	echo "及格"
else
	echo "不及格"
fi
# 执行脚本
./ifdemo.sh

在这里插入图片描述

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

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

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

#!/bin/bash
#1、定义时间变量
a=$(date +%H)
#2、定义时间段  早上
if [ $a -ge 6 -a $a -lt 11 ];then
   echo "现在时间是早上$a点"
#3、定义时间段 中午
elif [ $a -ge 11 -a $a -lt 13 ];then
   echo "现在时间是中午$a点"
#4、定义时间段 下午
elif [ $a -ge 13 -a $a -lt 18 ];then
   echo "现在时间是下午$a点"
#5、定时间段 晚上
elif [ $a -ge 18 -a $a -lt 24 ];then
   echo "现在时间是晚上$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 …
do
    echo $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
do
	echo ${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/bash

cd /var/log
count=0
for file in $(ls -R *)
do
        if [ -f "$file" ]; then
                echo "文件名:$file"
                ((count++))
        fi
done
echo "文件总数量:$count"

在这里插入图片描述

三、while 循环

3.1描述

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

方式一:

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

示例:

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

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

i=1
while((i<=3))
do
	echo $i
	let i++ # (($i++))
done

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

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

3.2 案例

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

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

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

#!/bin/bash
###演示while死循环,如果输出yes退出循环
while true
do
	echo "请输入字符串:"
	read y
if [ "$y" == "yes" ]; then
	exit 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):" num

case $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 脚本中广泛应用,例如:

  • 根据分数判断等级。
  • 判断奇偶数。
  • 打印指定目录下的文件名。
  • 统计文件数量。
  • 实现用户交互式的循环控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值