In Bash 脚本,while 循环用于在指定条件为 true 时执行语句块。基本语法是:
while [CONDITION]
do
# Commands to be executed
done
只要 CONDITION 计算结果为 true,循环就会继续执行。当条件变为假时,循环终止,程序继续执行循环后面的下一条语句。
简单的 While 循环示例
让我们看一个 while 循环的基本示例:
count=1
while [ $count -le 5 ]
do
echo "This is loop number $count"
((count++))
done
Output:
This is loop number 1
This is loop number 2
This is loop number 3
This is loop number 4
This is loop number 5
这里,一个变量count
初始化为 1。只要 的值存在,循环就会继续执行count
小于或等于5。
在循环内部,值count
在每次迭代中增加 1,使用((count++))
,一条消息将打印到屏幕上。
循环遍历文件
您可以使用 while 循环来迭代文件。
您可以处理目录中的所有文本文件来读取它们,如下所示:
find . -name "*.txt" | while read file
do
echo "Processing $file"
# You can add commands here to process each file
done
Output:
Processing ./file1.txt
Processing ./file2.txt
Processing ./directory/file3.txt
在此示例中,find
命令列出所有.txt
当前目录及其子目录中的文件。
The while
循环读取每一行(文件路径)并为每个文件执行循环内的代码。
在这里,它打印一条消息,但您可以根据需要添加任何命令来处理每个文件。
将 test 命令与 While 循环结合使用
The 测试命令Bash 中用于检查文件类型和比较值。它通常在 while 循环中使用,以提供更复杂的条件检查。
您可以使用 test 命令检查文件大小:
file_size=$(stat -c%s "file.txt")
while [ $file_size -lt 1024 ]
do
echo "File size is $file_size bytes. Waiting to reach 1KB..."
sleep 1
file_size=$(stat -c%s "file.txt")
done
Output:
File size is 100 bytes. Waiting to reach 1KB...
File size is 500 bytes. Waiting to reach 1KB...
...
在此示例中,您首先使用以下命令确定“file.txt”的文件大小stat -c%s
。只要文件大小小于 1024 字节 (1KB),while 循环就会继续执行。
在循环内,会打印一条消息,然后脚本等待 1 秒,然后再次检查文件大小。
此循环将持续进行,直到文件大小达到或超过 1KB。
while 循环中的条件允许进行各种比较。以下是执行这些操作的方法。
数值比较
value=10
while [ $value -ne 0 ]
do
echo "Value is $value"
((value--))
done
Output:
Value is 10
Value is 9
...
Value is 1
You use -ne
只要该值不等于 0,就继续循环。每次迭代该值都会减 1。
字符串比较
name="John"
while [ "$name" != "Doe" ]
do
echo "Name is $name"
name="Doe" # You would update this from an external source
done
Output:
Name is John
You use !=
比较字符串并继续循环,只要name
不等于“Doe”。
循环内的文件测试
while [ ! -e "file.txt" ]
do
echo "Waiting for file.txt to be created..."
sleep 1
done
Output:
Waiting for file.txt to be created...
You use -e
检查文件是否存在并继续循环直到“file.txt”存在。
退出循环
The break
命令使您能够在条件变为 false 之前退出循环。
count=1
while [ $count -le 10 ]
do
if [ $count -eq 5 ]; then
break
fi
echo "Count: $count"
((count++))
done
Output:
Count: 1
Count: 2
Count: 3
Count: 4
在此代码片段中,循环通常会迭代直到count
达到 10。但是,当count
等于 5,则break
命令被执行,提前终止循环。
跳到下一个迭代
The continue
命令用于跳过循环的当前迭代并继续下一次迭代。
number=1
while [ $number -le 10 ]
do
if [ $((number % 2)) -eq 0 ]; then
((number++))
continue
fi
echo "Odd number: $number"
((number++))
done
Output:
Odd number: 1
Odd number: 3
Odd number: 5
Odd number: 7
Odd number: 9
在这里,循环迭代从 1 到 10 的数字,但是continue
命令跳过偶数,导致循环仅打印奇数。
无限循环
可以使用以下语法创建无限循环:
while true
do
echo "This will run forever."
done
可以通过实施退出策略来控制无限循环。
count=1
while true
do
echo "Loop $count"
((count++))
if [ $count -gt 5 ]; then
break
fi
done
Output:
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
The while
循环始终为真,但我们使用了break
命令在计数达到 5 时退出 while 循环,从而防止实际的无限循环。
嵌套的 While 循环
嵌套 while 循环是另一个循环中的一个循环。以下是如何使用它们的示例:
i=1
while [ $i -le 10 ]
do
j=1
while [ $j -le 10 ]
do
echo -n "$((i * j)) "
((j++))
done
echo ""
((i++))
done
Output:
1 2 3 ... 10
2 4 6 ... 20
...
10 20 30 ... 100
此处,外循环迭代数字 1 到 10,内循环也迭代数字 1 到 10。
的乘法i
and j
被打印。
在 While 循环中使用输入
您可以使用 while 循环来处理来自文件或用户的输入。
从文件中读取行
while read line
do
echo "Line: $line"
done < file.txt
Output:
Line: First line of file.txt
Line: Second line of file.txt
...
在这里,读命令从“file.txt”读取每一行,循环单独处理每一行。
读取用户输入
while true
do
read -p "Enter 'exit' to quit: " input
if [ "$input" == "exit" ]; then
break
fi
echo "You entered: $input"
done
输出(取决于用户输入):
Enter 'exit' to quit: hello
You entered: hello
Enter 'exit' to quit: exit
这段代码读取用户输入,直到用户输入“exit”,它会调用break
命令退出循环。
While 循环中的错误处理
使用未定义的变量或不正确的命令语法可能会导致错误。您应该考虑这些错误。
file="file.txt"
while read line
do
# Processing code here
done < "$file" || echo "Error reading $file"
在这里,如果读取文件失败,则会打印一条错误消息。
调试技术(使用 set -x)
要跟踪脚本的执行,您可以使用set
命令。
set -x
count=1
while [ $count -le 5 ]
do
echo $count
((count++))
done
set +x
Output:
+ count=1
+ '[' 1 -le 5 ']'
+ echo 1
1
+ (( count++ ))
+ '[' 2 -le 5 ']'
+ echo 2
2
...
The set -x
命令在执行之前打印每个命令及其扩展参数,提供循环内发生的情况的详细跟踪。
实际应用
While 循环在现实世界的自动化和监控任务应用程序中至关重要。
监控系统资源
while true
do
free -m | awk '/^Mem:/ {print "Free memory: " $4 " MB"}'
sleep 5
done
此示例每 5 秒打印一次可用内存,利用free
and awk命令。
自动化重复性任务
files="/path/to/files/*.txt"
while read file
do
gzip "$file"
done <<< "$(ls $files)"
在这里,循环使用以下命令压缩目录中的所有文本文件gzip命令.
这些示例说明了 while 循环在系统监控和任务自动化中的一些应用。