开发工具

Shell while 语句

13 篇文章69 次收藏

在 Shell 脚本中,while 循环用于在条件为真时重复执行一组命令。以下是其语法结构和典型用法:

一、基本语法

while [ 条件测试 ]
do
    # 循环体命令
done


二、核心组成部分

1、while 关键字

表示循环开始,后跟条件测试。


2、条件测试

使用 [ ... ]、[[ ... ]] 或命令返回值(退出状态码)作为条件。

若条件测试的返回值为 0(真),则执行循环体。


3、do 和 done

do 标记循环体的开始。

done 标记循环体的结束。


三、常见用法示例

1. 计数器循环

count=0
while [ $count -lt 5 ]
do
    echo "当前计数: $count"
    ((count++))  # 或 count=$((count + 1))
done

# 输出:
# 当前计数: 0
# 当前计数: 1
# ...直到4


2. 读取文件内容

while read line
do
    echo "行内容: $line"
done < "/path/to/file.txt"  # 重定向输入


3. 处理命令输出

ls | while read file
do
    echo "文件: $file"
done


4. 无限循环

while true  # 或 while :
do
    echo "持续运行中..."
    sleep 1
done


5. 监控条件变化

# 持续检测服务是否运行
while ! systemctl is-active --quiet nginx
do
    echo "等待Nginx启动..."
    sleep 2
done
echo "Nginx已运行!"


四、循环控制

1、break 终止循环

while true
do
    read -p "输入 'exit' 退出: " input
    if [ "$input" = "exit" ]; then
        break
    fi
done


2、continue 跳过当前迭代

num=0
while [ $num -lt 10 ]
do
    ((num++))
    if [ $((num % 2)) -eq 0 ]; then
        continue  # 跳过偶数
    fi
    echo "奇数: $num"
done


五、高级用法

1. 多条件组合

a=0
b=10
while [ $a -lt 5 ] && [ $b -gt 5 ]
do
    echo "a=$a, b=$b"
    ((a++))
    ((b--))
done


2. 使用命令返回值作为条件

# 当ping成功时停止循环
while ! ping -c1 example.com &>/dev/null
do
    echo "等待网络连通..."
    sleep 5
done


3. C语言风格循环(Bash支持)

i=0
while ((i < 3))
do
    echo "i=$i"
    ((i++))
done


六、注意事项

1、避免无限循环

确保循环条件最终会变为假,或在循环体内有终止逻辑(如 break)。


2、变量作用域

若循环体内部通过管道(|)执行,变量修改可能不会影响外部:

count=0
seq 3 | while read num; do ((count++)); done
echo "$count"  # 输出0(管道创建子Shell,count不共享)


3、性能优化

避免在循环条件中执行耗时操作(如 curl),应将其结果存储在变量中:

result=$(curl -s example.com)
while [ "$result" = "OK" ]; do ... done


七、与 until 循环的区别

whileuntil
当条件为真时执行循环体当条件为假时执行循环体
while [ $a -lt 5 ]until [ $a -ge 5 ]


通过灵活使用 while 循环,可以实现条件驱动的重复任务处理。建议结合具体需求选择最合适的循环结构,并注意避免常见陷阱。