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 循环在条件成立时重复执行代码块,直到条件不满足为止。它支持两种方式:
- 通过条件表达式控制循环。
- 通过数值条件控制循环。
实际应用
条件判断和循环结构在 Shell 脚本中广泛应用,例如:
- 根据分数判断等级。
- 判断奇偶数。
- 打印指定目录下的文件名。
- 统计文件数量。
- 实现用户交互式的循环控制。