shell 多分支、for、while循环

shell 多分支、for、while循环


前言

shell 脚本中的 for 与 while 循环构成了自动化处理的两大支柱。for 循环本质上是“枚举式”的,它擅长处理已知的、有限的任务集合,无论是通过数值序列(如循环 5 次)还是通过元素列表(如处理一批文件),它都为每一次迭代提供了一个明确的上下文,非常适合进行遍历和批量操作。而 while 循环则是“条件式”的,它的核心在于“只要条件为真,就持续运行”,这使其成为监控任务、处理不确定长度的输入(如逐行读取文件直到末尾)或创建守护进程(通常使用无限循环)的理想选择。简而言之,当你需要遍历一个已知的集合时,for 循环是你的首选;而当循环次数由运行时的动态条件决定时,while 循环则提供了所需的灵活性。两者相辅相成,共同赋予了 Shell 脚本处理复杂逻辑和重复任务的能力。

一、多分支 if 语句

1. 语法结构

if 条件测试操作1
then
    命令序列1
elif 条件测试操作2
then
    命令序列2
else
    命令序列3
fi

2. 执行机制

  • 从上到下依次判断各个条件
  • 第一个满足的条件对应的代码块会被执行
  • 后续条件不再检查
  • 所有条件都不满足时执行 else 块

3. 典型示例

示例1:成绩等级判断
#!/bin/bash
read -p "请输入您的分数(0-100): " GRADE

if [ $GRADE -ge 85 -a $GRADE -le 100 ]  # -a 表示 AND 逻辑,判断优秀区间
then
    echo "$GRADE 分, 优秀!"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]  # && 是另一种 AND 写法
then
    echo "$GRADE 分, 合格!"
else
    echo "$GRADE 分, 不合格!"  # 前两个条件都不满足时执行
fi
示例2:文件类型判断
#!/bin/bash
name=/etc/  # 定义要检查的路径

if [ -d $name ]; then      # -d 检查是否为目录
    echo "这是一个目录"
elif [ -f $name ]; then    # -f 检查是否为普通文件
    echo "这是一个文件"
elif [ -b $name ]; then    # -b 检查是否为块设备文件
    echo "这是一个设备文件"
else
    echo "无法判断文件类别"  # 所有条件都不满足时的默认处理
fi

二、for 循环

1. 数值循环语法

for ((循环初始值; 循环条件; 修改循环条件))
do
    循环体代码
done

2. 列表遍历语法

for 变量名 in 项目1 项目2 项目3 ...
do
    程序代码
done

3. 典型示例

示例1:基础数值循环
#!/bin/bash
# 循环5次,i从0开始,每次递增1
for ((i=0; i<5; i++))
do
    echo "$i - Hello World"  # 显示当前循环次数
done
# 输出结果:
# 0 - Hello World
# 1 - Hello World
# ... 直到 4 - Hello World
示例2:累加计算
#!/bin/bash
count=0  # 初始化累加器

for ((i=1; i<=10; i++))
do
    count=$(($count+$i))  # 算术运算:将count与i相加
    echo "步骤 $i: count = $count"  # 显示每一步的计算结果
done

echo "最终累加值:$count"  # 输出最终结果
示例3:遍历字符串列表
#!/bin/bash
for animal in cat dog elephant  # 定义包含三个元素的列表
do
  echo "动物:${animal}"  # 每次循环输出一个动物名称
done
# 输出:
# 动物:cat
# 动物:dog
# 动物:elephant
示例4:遍历目录文件
#!/bin/bash
# 将 ls 命令结果保存到变量中
filelist=$(ls /root/shelldemo)

for filename in $filelist  # 遍历文件列表
do
    echo "文件名: $filename"  # 输出每个文件名
done
示例5:生成随机密码
#!/bin/bash
# 定义密码字符池
key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
num=${#key}  # 获取字符池长度
pass=''      # 初始化密码变量

# 循环8次生成8位密码
for i in {1..8}
do
    index=$[RANDOM % num]        # 生成随机索引
    pass=$pass${key:$index:1}    # 从字符池中随机取一个字符追加
done

echo "生成密码: $pass"
# 关键技术点:
# ${#key} - 获取字符串长度
# RANDOM - 系统随机数变量
# ${key:位置:长度} - 字符串截取

三、

1. 创建无限循环的三种方式

# 方式1:使用 true 命令(推荐)
while true
do
    command
done

# 方式2:使用冒号命令
while :
do
    command
done

# 方式3:使用永远为真的条件
while [ 1 -eq 1 ]
do
    command
done

2. 典型示例

示例1:猜数字游戏
#!/bin/bash
num=10  # 设置目标数字

while true  # 开始无限循环
do
    read -p "请输入数字:" shu  # 获取用户输入
    
    if [ $shu -eq $num ]; then
        echo "恭喜,猜对了!"
        break  # 猜对时跳出循环
    elif [ $shu -gt $num ]; then
        echo "猜大了"
    elif [ $shu -lt $num ]; then
        echo "猜小了"
    fi
done
# 关键技术:break 用于终止循环
示例2:服务状态监控
#!/bin/bash
# 监控 httpd 服务状态
while ps aux | grep httpd | grep -v grep &>/dev/null
do
    echo "httpd 服务运行中..."
    sleep 2  # 等待2秒后再次检查
done

echo "httpd 服务已停止"
# 关键技术点:
# grep -v grep - 排除 grep 进程本身
# &>/dev/null - 屏蔽所有输出
# sleep - 控制检查频率,避免资源过度消耗

四、关键技术总结

1. 流程控制要点

  • 多分支if:适合多个互斥条件的场景
  • for循环:适合已知循环次数的场景
  • while无限循环:适合需要持续监控的场景

2. 循环控制语句

  • break:立即退出当前循环
  • continue:跳过本次循环,继续下一次
  • exit:退出整个脚本

3. 实用技巧

  • 无限循环中必须设置退出条件
  • 使用 sleep 控制循环频率
  • 结合 &>/dev/null 屏蔽不必要输出

总结

Shell编程的核心在于流程控制:if语句提供条件判断,实现分支逻辑;for循环擅长遍历集合,处理已知任务;while循环基于条件运行,适合监控和动态处理。三者协同构建自动化脚本,让系统管理、批量操作和服务监控变得高效智能。掌握这些结构,方能写出真正强大的Shell脚本。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值