Unix / Linux - Shell 循环控制

你好,有抱负的程序员们!今天,我们将深入探索Unix和Linux shell脚本中的循环控制世界。作为你友好邻邦的计算机老师,我将引导你一步一步地完成这次旅行。如果你是编程新手,不用担心——我们将从基础开始,逐步提升。所以,拿起一杯咖啡(或者茶,如果你喜欢的话),让我们一起进入循环!

Unix / Linux - Loop Control

理解循环

在我们跳入循环控制之前,让我们快速回顾一下循环是什么。想象你被分配了一个任务,在黑板上写100次“我爱编程”。你不需要手动写100次,而是可以使用循环来自动化这个重复的任务。这正是编程中循环的作用——它们允许我们多次执行一组命令,而无需反复编写它们。

无限循环

现在,让我们来谈谈一些既迷人又可能潜在危险的东西:无限循环。它就像一个永不停止的旋转木马——它只是不停地转动。

什么是无限循环?

无限循环是一个由于其终止条件永远不会满足而继续运行的循环。虽然这听起来像是灾难的配方,但实际上在某些场景下无限循环是有用的(稍后会详细介绍)。

无限循环示例

下面是在shell脚本中一个简单的无限循环示例:

#!/bin/bash
while true
do
echo "这是一个无限循环!"
sleep 1
done

在这个脚本中:

  • while true 创建了一个始终为真的条件,因此循环永远不会停止。
  • echo 打印我们的消息。
  • sleep 1 在下一次迭代之前暂停脚本1秒。

如果你运行这个脚本,你会看到每秒都会打印 "这是一个无限循环!",直到你手动停止脚本(通常是按 Ctrl+C)。

我们什么时候会使用无限循环?

相信或不相信,无限循环并不总是坏的!它们在以下场景中可能很有用:

  1. 创建需要持续运行的程序(如服务器)。
  2. 实现一个用户可以重复选择选项的菜单系统。
  3. 监控特定事件或条件的系统。

请记住,能力越大,责任越大。总是确保你有办法在需要时退出你的无限循环!

break 语句

现在我们已经看到了循环可以永远继续下去,让我们学习如何在想要的时候停止它们。引入 break 语句——从任何循环中的紧急出口。

break 是做什么的?

break 语句所做的正如其名——它“跳出”当前的循环,不管循环的条件是否仍然为真。

使用 break 的示例

让我们修改之前的无限循环,使其在5次迭代后停止:

#!/bin/bash
count=0
while true
do
echo "循环迭代:$count"
count=$((count + 1))
if [ $count -eq 5 ]
then
echo "跳出循环!"
break
fi
sleep 1
done
echo "循环已结束。"

在这个脚本中:

  • 我们初始化一个 count 变量来跟踪迭代次数。
  • 每次迭代,我们增加 count 并检查它是否等于5。
  • 如果 count 是5,我们打印一条消息并使用 break 来退出循环。

当你运行这个脚本时,你会看到它计数到5然后停止。

continue 语句

虽然 break 让我们完全退出循环,但有时我们只是想跳过当前迭代的剩余部分并移动到下一个迭代。这时 continue 就派上用场了。

continue 是做什么的?

continue 语句跳过当前循环迭代的剩余部分,并跳转到下一个迭代。

使用 continue 的示例

让我们创建一个脚本,打印从1到10的数字,但跳过偶数:

#!/bin/bash
for i in {1..10}
do
if [ $((i % 2)) -eq 0 ]
then
continue
fi
echo $i
done

在这个脚本中:

  • 我们使用一个 for 循环来迭代1到10。
  • if [ $((i % 2)) -eq 0 ] 检查数字是否为偶数(即能否被2整除且余数为0)。
  • 如果数字是偶数,continue 跳转到下一个迭代。
  • 否则,我们打印该数字。

当你运行这个脚本时,你将只看到奇数被打印:1, 3, 5, 7, 9。

一切皆有可能

现在我们已经学习了无限循环、breakcontinue,让我们创建一个更复杂的示例,它使用了所有这些概念:

#!/bin/bash

echo "欢迎来到数字猜谜游戏!"
secret_number=$((RANDOM % 10 + 1))
attempts=0

while true
do
read -p "猜测一个1到10之间的数字(或输入'q'退出): " guess

if [ "$guess" = "q" ]
then
echo "感谢游玩!秘密数字是 $secret_number。"
break
fi

if ! [[ "$guess" =~ ^[0-9]+$ ]]
then
echo "请输入一个有效的数字或'q'退出。"
continue
fi

attempts=$((attempts + 1))

if [ "$guess" -eq "$secret_number" ]
then
echo "恭喜!你用了 $attempts 次尝试猜对了数字!"
break
elif [ "$guess" -lt "$secret_number" ]
then
echo "太低了!再试一次。"
else
echo "太高了!再试一次。"
fi
done

这个脚本创建了一个简单的数字猜谜游戏,展示了:

  • 一个无限循环来保持游戏运行。
  • 使用 break 在玩家猜对数字或选择退出时退出。
  • 使用 continue 跳过无效输入。

循环控制语句总结

下面是我们学到的循环控制语句的快速参考表:

语句 描述 用例
while true 创建一个无限循环 当你需要一个循环持续运行直到满足特定条件时
break 退出当前循环 当你基于某个条件想要停止循环时
continue 跳转到循环的下一个迭代 当你想要基于某个条件跳过当前迭代的剩余部分时

请记住,循环是编程中的强大工具,但能力越大,责任越大。总是确保你有办法退出你的循环,并且明智地使用 breakcontinue 来创建高效和有效的脚本。

快乐的编码,未来的shell脚本巫师们!愿你的循环在你想要的时候无限,愿你的 break 语句总能在需要的时候出现。下次见,继续循环和学习!

Credits: Image by storyset