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

Shell 流程控制

Shell 流程控制是 Shell 脚本编程的核心,它通过条件判断、循环、分支等逻辑结构,控制脚本的执行顺序,从而实现自动化任务和复杂逻辑。以下是详细的讲解:


1. 顺序执行

Shell 脚本默认按从上到下的顺序执行命令,适用于简单任务。例如:

#!/bin/bash
echo "开始执行"
cd /data
mkdir backup
echo "任务完成"

特点:无需任何控制语句,命令按顺序依次执行。


2. 条件判断(选择执行)

条件判断允许脚本根据特定条件决定执行路径。主要通过 ifcaseselect 实现。

2.1 if 语句

语法

if [ 条件 ]; then# 条件为真时执行
elif [ 条件 ]; then# 第二个条件为真时执行
else# 所有条件为假时执行
fi

示例

#!/bin/bash
a=5
b=10
if [ $a -lt $b ]; thenecho "$a 小于 $b"
elif [ $a -gt $b ]; thenecho "$a 大于 $b"
elseecho "$a 等于 $b"
fi

常用比较操作符

  • -eq(等于)、-ne(不等于)、-lt(小于)、-gt(大于)
  • 字符串比较:=(等于)、!=(不等于)、<(小于)、>(大于)
  • 文件测试:-f(文件存在)、-d(目录存在)、-r(可读)、-w(可写)
2.2 [[ ]][ ] 的区别
  • [[ ]] 是 Bash 的内置条件表达式,支持更复杂的操作符(如逻辑运算符 &&||)。
  • 无需额外引号包裹变量,避免空格问题。
if [[ $a -lt $b && $b -gt 5 ]]; thenecho "条件成立"
fi
2.3 test 命令

test[ ] 功能相同,但语法更紧凑:

if test $a -lt $b; thenecho "$a 小于 $b"
fi
2.4 逻辑运算符 &&||
  • &&:前一个命令成功时执行后一个命令。
  • ||:前一个命令失败时执行后一个命令。
# 判断文件是否存在
[ -f "/etc/hosts" ] && echo "文件存在" || echo "文件不存在"

3. 多分支选择(case 语句)

case 适用于多个条件的匹配,类似于多个 if-elif 的组合。

语法

case $variable inpattern1)# 匹配 pattern1 时执行;;pattern2)# 匹配 pattern2 时执行;;*)# 默认情况;;
esac

示例

#!/bin/bash
read -p "请输入一个数字(1-3):" num
case $num in1)echo "One";;2)echo "Two";;3)echo "Three";;*)echo "输入无效";;
esac

4. 循环结构

循环用于重复执行特定代码块,直到满足终止条件。

4.1 for 循环

语法

for 变量 in 列表; do# 循环体
done

示例

# 输出 1-5
for i in {1..5}; doecho $i
done# 遍历文件列表
for file in /etc/*.conf; doecho $file
done
4.2 while 循环

语法

while [ 条件 ]; do# 条件为真时循环
done

示例

#!/bin/bash
a=1
while [ $a -le 5 ]; doecho $alet a++
done
4.3 until 循环

语法

until [ 条件 ]; do# 条件为假时循环
done

示例

#!/bin/bash
counter=1
until [ $counter -gt 5 ]; doecho "Counter: $counter"((counter++))
done

5. 流程控制命令

5.1 breakcontinue
  • break:退出当前循环。
  • continue:跳过当前迭代,继续下一次循环。
#!/bin/bash
for i in {1..10}; doif [ $i -eq 5 ]; thenbreak  # 当 i=5 时退出循环fiecho $i
done
5.2 exit

exit 用于终止脚本并返回状态码(0 表示成功,非 0 表示失败):

#!/bin/bash
if [ $# -ne 1 ]; thenecho "Usage: $0 <remote_ip>"exit 1
fi

6. 实际应用案例

6.1 检查磁盘使用率
#!/bin/bash
usage=$(df -h / | awk '/\/$/ {print $5}' | cut -d'%' -f1)
if [ $usage -gt 80 ]; thenecho "警告:根分区使用率超过 80%!" | mail -s "磁盘告警" admin@example.com
fi
6.2 判断素数
is_prime() {local num=$1if [ $num -lt 2 ]; thenreturn 1fifor ((i=2; i<num; i++)); doif [ $(($num % i)) -eq 0 ]; thenreturn 1fidonereturn 0
}read -p "请输入一个数字: " n
is_prime $n
if [ $? -eq 0 ]; thenecho "$n 是素数"
elseecho "$n 不是素数"
fi

7. 注意事项

  1. 变量引用:在 [ ][[ ]] 中引用变量时,建议用双引号包裹(如 [ "$var" = "value" ]),避免空格导致错误。
  2. 空格问题[ ] 中的运算符前后必须有空格(如 [ $a -lt $b ])。
  3. 调试脚本:使用 set -x 启用调试模式,查看脚本执行过程。

8. 总结

Shell 流程控制的核心是 条件判断循环,通过合理组合这些结构,可以实现复杂的自动化任务。掌握 ifcaseforwhile 等语句的用法,并结合 breakcontinueexit 控制流程,是编写高效 Shell 脚本的关键。

👍 世上无难事,只要肯登攀
😊 希望对你有帮助!

相关文章:

  • 什么是Sanity Testing?和冒烟测试的区别?
  • Kotlin中协程挂起函数的本质
  • 数据结构学习——二叉树
  • PCIE中基于地址的路由
  • IPV6概述
  • 【Android知识点】面试版
  • 1. 配置OSPF智能定时器
  • Docker 入门教程(三):镜像操作命令
  • 【菜狗的记录】模糊聚类最大树、图神经网络、大模型量化——20250627
  • Ubuntu安装Docker部署Python Flask Web应用
  • 【RAG面试题】如何获取准确的语义表示
  • 自动登录脚本神器-Mac电脑实现自动登录堡垒机并自动输入账号密码跳转不同机器环境
  • GitHub Actions与AWS OIDC实现安全的ECR/ECS自动化部署
  • 用 pnpm + TurboRepo,构建多项目高效开发体系
  • 参考nlohmann json设计Cereal宏 一行声明序列化函数
  • git add 报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xaf in position 42
  • 【iOS初体验】Hello, UIKit! - 第一个iOS App保姆式教程
  • iOS App 上架常见问题解决方案:六大难点与实战工具分工详解
  • CatBoost:征服类别型特征的梯度提升王者
  • 数据驱动AI研发的质量与效能策略