Bash 脚本循环

ShellBeginner
立即练习

介绍

在本实验中,你将学习如何在 Bash 脚本中使用循环。循环是强大的工具,允许你多次重复一组指令,从而使你的脚本更加高效和灵活。我们将涵盖三种类型的循环:forwhileuntil。此外,你还将探索 breakcontinue 语句,它们提供了对循环执行的控制。本实验专为初学者设计,将引导你逐步掌握每个概念。

这是一个引导实验,提供逐步指导以帮助你学习和练习。请仔细按照说明完成每个步骤并获得实践经验。历史数据表明,这是一个初学者级别的实验,完成率为 98%。它获得了学习者 100% 的好评率。

环境准备

让我们从设置工作环境开始。我们将创建一个新目录来存储所有的循环实验文件。

在 WebIDE 中打开终端。默认情况下,你应该处于 /home/labex/project 目录中。如果不确定,可以随时使用此命令导航到该目录:

cd /home/labex/project

现在,为我们的循环实验创建一个新目录:

mkdir bash_loops
cd bash_loops

这会创建一个名为 bash_loops 的新目录并进入其中。我们将在这个目录中进行所有的循环实验。

为什么要这样做?将脚本组织到目录中是一个良好的实践。它可以保持工作区整洁,并使查找和管理文件变得更加容易。

for 循环

for 循环用于遍历一系列值。这就像在说:「对于列表中的每个项目,执行某些操作。」让我们创建一个脚本来演示如何使用 for 循环。

bash_loops 目录中创建一个名为 for_loop.sh 的新文件:

touch for_loop.sh

现在,在 WebIDE 中打开 for_loop.sh 文件并添加以下内容:

#!/bin/bash

## 遍历名称数组
echo "Looping through an array:"
NAMES=("Alice" "Bob" "Charlie" "David")
for name in "${NAMES[@]}"; do
  echo "Hello, $name!"
done

echo ## 打印空行以提高可读性

## 遍历数字范围
echo "Looping through a range of numbers:"
for i in {1..5}; do
  echo "Number: $i"
done

让我们分解一下这个脚本的作用:

  1. 第一个循环遍历一个名称数组。对于数组中的每个名称,它都会打印一条问候语。
  2. 第二个循环使用范围 {1..5} 从 1 数到 5。

"${NAMES[@]}" 这种语法可能看起来很奇怪。@ 表示「数组的所有元素」,而引号和大括号确保每个元素都被视为一个独立的项,即使它包含空格也是如此。

保存文件并使用此命令使其可执行:

chmod +x for_loop.sh

chmod +x 命令使文件具有可执行权限,这意味着你可以将其作为程序运行。

现在,运行脚本:

./for_loop.sh

你应该会看到如下输出:

Looping through an array:
Hello, Alice!
Hello, Bob!
Hello, Charlie!
Hello, David!

Looping through a range of numbers:
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

这演示了 for 循环如何遍历数组和数字范围。

while 循环

只要指定的条件为真(true),while 循环就会执行一段代码块。这就像在说:「当此条件为真时,请继续执行此操作。」

创建一个名为 while_loop.sh 的新文件:

touch while_loop.sh

在 WebIDE 中打开 while_loop.sh 文件并添加以下内容:

#!/bin/bash

## 使用 while 循环进行简单的倒计时
count=5
echo "Countdown:"
while [ $count -gt 0 ]; do
  echo $count
  count=$((count - 1))
  sleep 1 ## 等待 1 秒
done
echo "Blast off!"

让我们分解这个脚本:

  1. 我们从 count=5 开始,设置初始倒计时值。
  2. 条件 [ $count -gt 0 ] 表示「当 count 大于 0 时」。
  3. 在循环内部,我们打印当前的 count 值,将其减 1,然后等待一秒钟。
  4. 这一过程会一直持续到 count 达到 0,此时循环结束。

sleep 1 命令会让脚本暂停 1 秒钟,从而产生实时的倒计时效果。

保存文件并使其可执行:

chmod +x while_loop.sh

现在,运行脚本:

./while_loop.sh

你会看到从 5 到 1 的倒计时,每个数字之间有一秒钟的停顿:

Countdown:
5
4
3
2
1
Blast off!

这演示了 while 循环如何重复执行操作,直到条件不再满足。

until 循环

until 循环与 while 循环类似,但有一个重要的区别:它会一直执行,直到指定的条件变为真(true)。这就像在说:「继续执行此操作,直到此条件为真。」

创建一个名为 until_loop.sh 的新文件:

touch until_loop.sh

在 WebIDE 中打开 until_loop.sh 文件并添加以下内容:

#!/bin/bash

## 使用 until 循环数到 5
count=1
echo "Counting up to 5:"
until [ $count -gt 5 ]; do
  echo $count
  count=$((count + 1))
  sleep 1 ## 等待 1 秒
done

让我们分解这个脚本:

  1. 我们以 count=1 作为初始值。
  2. 条件 [ $count -gt 5 ] 表示「直到 count 大于 5」。
  3. 在循环内部,我们打印当前的 count 值,将其加 1,然后等待一秒钟。
  4. 这一过程会一直持续到 count 变得大于 5,此时循环结束。

保存文件并使其可执行:

chmod +x until_loop.sh

现在,运行脚本:

./until_loop.sh

你会看到打印出数字 1 到 5,每个数字之间有一秒钟的停顿:

Counting up to 5:
1
2
3
4
5

这演示了 until 循环如何重复执行操作,直到条件变为真。

使用 break 和 continue 语句

breakcontinue 语句用于控制循环的流程。break 会提前退出循环,而 continue 会跳过当前迭代的剩余部分并进入下一次迭代。

创建一个名为 break_continue.sh 的新文件:

touch break_continue.sh

在 WebIDE 中打开 break_continue.sh 文件并添加以下内容:

#!/bin/bash

## 使用 break 提前退出循环
echo "Demonstration of break:"
for i in {1..10}; do
  if [ $i -eq 6 ]; then
    echo "Breaking the loop at $i"
    break
  fi
  echo $i
done

echo ## 打印空行以提高可读性

## 使用 continue 跳过迭代
echo "Demonstration of continue (printing odd numbers):"
for i in {1..10}; do
  if [ $((i % 2)) -eq 0 ]; then
    continue
  fi
  echo $i
done

让我们分解这个脚本:

  1. 在第一个循环中,当 i 等于 6 时,我们使用 break 退出循环。
  2. 在第二个循环中,我们使用 continue 跳过偶数。条件 $((i % 2)) -eq 0 用于检查一个数是否为偶数(即除以 2 余数为 0)。

% 运算符用于计算除法后的余数。因此,对于偶数,i % 2 的结果为 0,对于奇数,结果为 1。

保存文件并使其可执行:

chmod +x break_continue.sh

现在,运行脚本:

./break_continue.sh

你应该会看到如下输出:

Demonstration of break:
1
2
3
4
5
Breaking the loop at 6

Demonstration of continue (printing odd numbers):
1
3
5
7
9

这演示了 break 如何提前退出循环,以及 continue 如何根据条件跳过某些迭代。

总结

在本实验中,你学习了 Bash 脚本中的三种循环类型:

  1. for 循环:遍历项目列表或数字范围。
  2. while 循环:只要条件为真就继续执行。
  3. until 循环:一直执行直到条件变为真。

你还学习了 breakcontinue 语句,它们让你能够更精细地控制循环。

这些循环结构是许多脚本的基础,能够让你高效地自动化重复性任务。请尝试在自己的脚本中使用这些循环,以进一步熟悉它们的行为和应用场景。