前言

Linux中,while循环是一种常见的循环结构,它可以通过测试条件的真假来重复执行代码块。

案例

持续监控应用状态

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 持续监控应用状态,直到应用运行正常
while true
do
if systemctl status myapp | grep -q "active (running)"; then
break
fi
sleep 10
done

持续检查服务器负载

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# 持续检查服务器负载,如果负载过高则发送警报邮件
while true
do
load=$(uptime | awk '{print $10}')
if [ $(echo "$load > 1.0" | bc -l) -eq 1 ]; then
echo "Warning: server load is high: $load" | mail -s "Server load warning" admin@example.com
fi
sleep 300
done

持续检查应用日志

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 持续检查应用日志,如果有错误日志则发送警报邮件
while true
do
if grep -q "Error" /var/log/myapp.log; then
echo "Warning: Error log found in myapp.log" | mail -s "Application error" admin@example.com
fi
sleep 600
done

持续同步文件夹

1
2
3
4
5
6
7
8
#!/bin/bash
# 持续将本地文件夹同步到远程服务器上
while true
do
rsync -avz /local/folder/ user@remote-server:/remote/folder/
sleep 3600
done

持续备份数据库

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 持续备份数据库,每天备份一次
while true
do
now=$(date +"%Y-%m-%d_%H-%M-%S")
mysqldump -u root -p password mydb > "/backup/mydb_$now.sql"
sleep 86400
done

从文件中读取行,直到文件末尾

1
2
3
4
5
#!/bin/bash
while read line
do
echo $line
done < filename.txt

计数器循环

1
2
3
4
5
6
7
#!/bin/bash
counter=0
while [ $counter -lt 10 ]
do
echo $counter
counter=$((counter+1))
done

循环处理命令行参数

1
2
3
4
5
6
#!/bin/bash
while [ "$1" != "" ]
do
echo $1
shift
done

监听文件变化

1
2
3
4
5
#!/bin/bash
while inotifywait -e modify /path/to/file
do
echo "File changed"
done

使用事项

  • while循环的语法为:while test command;do;done
  • test command是测试条件的命令,可以是任何Linux命令或逻辑表达式。
  • while循环中的代码块必须用dodone包围。
  • 在循环内部需要使用变量时,变量名前必须加上$符号。
  • 当使用while循环读取文件时,要确保文件中没有特殊字符或格式问题。
  • while循环中使用计数器时,要确保计数器的初始值和每次增量都是整数。
  • 在循环内部使用sleep命令可以使循环暂停一段时间,避免资源占用过多。