shell结构化命令——C语言风格的for命令

如果你从事过C语言编程,那么可能会惊讶于bash shell中for命令的工作方式。在C语言中,for循环通常会定义一个变量,然后在每次迭代时更改。程序员通常会将这个变量用作计数器,每次迭代时让计数器增1或减1。bash的for命令也提供了这个功能。本次将展示如何在bash shell脚本中使用仿C语言的for命令。

C语言中的for命令

C语言中的for命令包含循环变量初始化、循环条件以及每次迭代时修改变量的方法。当指定的条件不成立时,for循环就会停止。迭代条件使用标准的数学符号定义。例如,考虑下面的C语言代码:

for (i = 0; i < 10; i++)

{

        printf("The next number is %d
", i);

}

这段代码是一个简单的循环,其中变量i作为计数器。第一部分负责初始化变量。中间的部分负责定义循环条件。如果条件不成立,for循环就会停止迭代。最后一部分负责定义迭代过程。在每次迭代之后,执行最后一部分中定义的表达式。在本例中,i变量会在每次迭代后增1.

bash shell也支持for循环,看起来跟C语言的for循环类似,但存在一些细微的差异,其中一些地方让shell脚本程序员摸不着头脑。bash中仿C语言的for循环的基本格式如下:

for (( variable assignment ; condition ; iteration process ))

仿C语言的for循环的格式着实让bash shell脚本程序员感到困惑,因为它使用了C语言风格而不是shell风格的变量引用方式。这种for命令看起来如下所示。

for (( a = 1; a < 10; a++ ))

注意,有些地方与bash shell标准的for命令并不一致。

  • 变量赋值可以有空格。
  • 迭代条件中的变量不以美元符号开头。
  • 迭代过程的算式不使用expr命令格式。

shell开发人员设计这种格式是为了更贴切地模仿C语言的for命令。这对C语言程序员来说自然是件好事,却把有经验的shell程序员弄得一头雾水。在脚本中使用仿C语言的for循环时要小心。

下面这个例子在bash shell程序中使用了仿C语言的for命令:

$ cat test8
#!/bin/bash
# testing the C-style for loop

for (( i=1; i <= 10; i++ ))
do
    echo "The next number is $i"
done
$ ./text8
The next number is 1
The next number is 2
...

for 循环通过定义好的变量(本例中是变量i)来迭代执行这些命令。在每次迭代中,$i变量都包含for循环中赋予的值。在每次迭代后,循环的迭代过程会作用于变量,在本例中,是将变量值增1。 

使用多个变量

仿C语言的for命令也允许为迭代使用多个变量。循环会单独处理每个变量,你可以为每个变量定义不同的迭代过程。尽管可以使用多个变量,但只能在for循环中定义一种迭代条件:

$ cat test9
#!/bin/bash
# multiple variables

for (( a=1; b=10; a <=10; a++, b-- ))
do
    echo "$a - $b"
done
$ ./test9
1 - 10
2 - 9
...

变量a和b各自用不同的值来初始化并定义不同的迭代过程。循环的每次迭代在增加变量a的同时减小了变量b。