主页 实验环境 学习Linux - Study Area CN

循环

我相信你一定听说过循环这个词,循环可以让我们重复执行一段代码,帮助我们完成一些重复的工作。循环也有许多的类型,有可以一直持续下去的,也可以就执行几次。

那么在 Shell Script 中,我们可以使用以下几种循环结构:

  • for-in: 依次循环某个数组中的每个元素。
  • for:可以方便的从一个数走到另一个数,当然不止这一种用法。
  • while: 在条件为真时,重复执行一段代码。
  • until: 在条件为假时,重复执行一段代码。

接下来就让我们逐一讲解这些循环结构吧。

数组

数组是 Shell Script 中的一种数据结构。数组在 sh 上并不存在,你需要使用 bash。它可以存储多个值,并且可以通过数字(索引)来访问这些值。

在 zsh 等 Shell 中,数组的行为并不总是一样的。下文均使用 bash。

在 Shell Script 中,我们可以使用以下语法来定义一个数组:

array=("value1" "value2" "value3")

数组中的元素都拥有一个唯一的索引,索引从 0 开始。我们可以使用下面的方法来访问数组中的元素:

${array[0]}

这将会返回 array 数组中的第一个元素,即 value1

for-in 循环

for-in 循环是 Shell Script 中最常用的循环结构之一,它允许我们依次循环某个数组中的每个元素。以下是一个简单的 for-in 循环示例:

for variable in array
do
    你的代码
done

在这个示例中,variable 是循环变量,array 是要循环的数组。在每次循环中,variable 都会按顺序被赋值为 array 中的一个元素,然后执行你的代码。当 array 中的所有元素都被循环完毕后,循环结束。

这里 array 除了可以放数组之外,也可以放字符串(按行遍历)和范围语句。

范围语句的格式如下:

{起点..终点}
{起点..终点..步长}

在 bash 中,起点可以大于终点,但是步长要为正数。并且起点和终点都会被遍历

例如:

for num in {1..10}
do
    echo $num
done

会输出从 1 到 10。

在范围语句内不能加变量,如果需要使用变量请往下看。

for 循环

for 循环是 Shell Script 中另一种常用的循环结构,它允许我们使用初始化、判断条件、迭代语句来控制循环的执行。以下是一个简单的for循环示例:

for ((初始化语句; 你的条件; 迭代语句))
do
    你的代码
done

在这个例子中,初始化语句会被执行,然后执行一次判断语句。如果判断语句的结果为真,那么就会进行一次循环。当你的代码运行完毕后,会执行一次迭代语句,然后再回去执行判断。

例如:

for ((i=1; i<=10; i++))
do
    echo $i
done

就对应了 {1..10..1} 的结果。

这里表达式和方括号有区别,不能使用 -lt 一类的符号。可以使用:==>=<=!=

而后面的 i++ 中,可以使用 --,也可以使用 +=-=*=/= 后面加一个数字。

while 循环

while 循环允许我们在某个条件为真时,重复执行一段代码。以下是一个简单的示例:

while 条件
do
    你的代码
done

while 循环就相当于一个 for 循环,但是没有了初始化和迭代语句。如果你在条件的位置写上了 true,那么它会永无休止的执行下去,除非你手动停止。

while 中的条件需要使用方括号。

例如:

i=1
while [ $i -le 10 ]
do
    echo $i
    i=$[ $i + 1 ]
done

和上面 for 的版本是一样的。

until 循环

until 循环刚好与 while 循环相反,它允许我们在某个条件为假时,重复执行一段代码。以下是一个简单的 until 循环示例:

until 你的条件
do
    你的代码
done

until 因为 和 while 十分相似,这里就不过多解释了。

until 循环常常被用于多次尝试的场景下,例如尝试连接到一个远程服务器,直到连接成功为止。

课后作业

  • 使用 for 循环制作一个程序,这个程序读取一个正整数 N,并输出 2^N 的值(提示:只需要让变量从 1 开始,每次乘 2 即可)。
  • 使用 while 循环制作一个猜数字游戏,程序会随机生成一个 1 到 100 之间的整数,玩家需要猜出这个数字是多少,程序会根据玩家的猜测给出猜大了或者猜小了的提示,直到玩家猜对为止(提示:生成随机数可以使用 $[ $RANDOM % 99 + 1 ],其中 $RANDOM 是一个 0~32767 的随机整数)。
  • 使用 for-in 循环制作一个程序,该程序读取一个列表,并挨个输出它的所有元素。