Shell脚本第4部分:重复控制结构

欢迎来到youcl的shell脚本教程系列的第四部分(点击此处阅读本教程的第1 部分,第2 部分第3部分)。 在这部分中,我们将介绍bash shell的不同重复控制结构以及如何通过一些例子来使用每个结构。 让我们开始吧。

介绍

重复控制结构,也称为循环控制结构,是用于简化重复或递归任务的编程语言中的一种控制结构。 循环语句通过提供一种最小化代码的方式来优化任何代码,使其比提供相同输出的非结构化代码更易于排除故障。 bash shell支持三种类型的循环语句 - forwhileuntil循环。

循环

for循环是循环语句,它使用关键字来声明重复语句。 bash支持for循环语句的不同语法:

语法1:For-in结构

for <varName> in <list>
do
    #### your statement here
done

此语法以关键字for ,然后是变量名称,关键字in和变量的可能值列表开头。 列表中的每个值将以空格分隔,并且将重复的代码行的开始在do中定义并以done关键字结束。

让我们创建一个简单的循环语句,这将允许用户输入5个值并获得数字的总和:

#!/bin/bash 
result=0;
input=0;
for var in 1 2 3 4 5
do
     printf "Input integer %d : " $var
     read input
     result=$((result+input))
done
echo "the result is " $result

在这个例子中,变量var用作我们循环的计数器。 它的值在关键字in之后的数字列表中定义并且shell在循环语句中的每个循环执行后更改var变量的值。 由于我们的列表中只有五个整数值,shell将在循环语句中执行代码只有五次。

语法2:用于具有字符串列表值的循环语句

您还可以声明一个变量,用于计数器的项目列表。 例如,考虑以下代码:

#!/bin/bash
list="var1 var2 var3 var4"
var=""
mkdir sample
cd sample
echo creating the "directories...."
for var in $list
do
     mkdir $var
done

列表=“var1 var2 var3 var4”定义列表变量的值。 然后在$ list中为var分配给var,最后,在mkdir $ var行中创建目录

语法3:用于将列表作为文件的循环语句

您还可以从现有文件中检索要用于循环语句的列表,而不是使用cat命令在代码中声明该列表。 例如,打开你最喜欢的文本编辑器,然后列出至少五个目录名。

接下来在同一个文本编辑器中打开一个新的选项卡,并创建一个新的脚本。 该脚本应该保存在同一个目录中,其中先前创建的目录列表将被保存。

#!/bin/bash 
dirList=$(cat list)
echo "creating directories...."
for var in $dirList
do
mkdir $var
done

当您必须在Linux计算机上创建数百个目录时,此示例变得方便,不是吗?

语法4:C语法

for((initialization; boolean_test; increment/decrement))
do
#### your code goes here
done

也许,shell最支持的for循环的最熟悉的结构是C样结构。 循环从计数器变量的初始化开始,然后shell评估初始化后声明的布尔表达式。 如果布尔表达式结果为true,那么shell将在do子句内执行一组语句,否则它会终止循环语句,并继续执行完成关键字之后的 。 shell将通过布尔测试后声明的增量或减量语句进行下一次迭代。 例如,我们用这个结构重构我们的第一个例子。

#!/bin/bash 
result=0
input=0
for((var=1;var<=5;var++))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
done
echo $result

循环声明

while语句是bash中使用关键字while的重复结构的一种类型。 与循环结构的C型语法不同, while重复控制结构分离了初始化,布尔测试和increment / decrement语句。

语法1:具有运算符号的结构基于条件语句

<initialization>
while(condition)
do
    ###your code goes here
<increment/decrement>
done

为了能够与其他循环语句区分开来,我们来构建我们第一个while语句的例子。

#!/bin/bash
result=0
input=0
var=1
while((var <= 5))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

看看我们的例子, while语句从我们的计数器变量var的初始化开始。 接下来,布尔测试在关键字之后声明并且要重复的语句集将在dodone语句内声明。 在while语句中,如果布尔测试结果为真,解释器将仅启动并执行代码的重复。 另一方面,当布尔表达式为false时,循环语句will语句将仅终止代码的迭代。

语法2:循环语句与基于助记符的条件语句

<initialization>
while [ <condition> ]
do
####your code goes here
<increment/decrement>
done

您还可以在while循环语句内声明基于助记符的条件语句。 对于声明,将使用方括号替代括号。 ( 在这里查看基于助记符的条件语句)例如:

#!/bin/bash 
var=1;
while [ $var -le 5 ]
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

语法3:循环语句与基于文件的条件语句

while read <variable_name>
do
####your code goes here
done <<path to the text file>

就像我们在循环语句中所做的一样,您也可以打开一个文本文件,并在while循环语句中关联它。 例如:

#!/bin/bash 
mkdir sample2
cd sample2
echo "creating directories..."
while read var
do
    mkdir $var
done<list

在这个例子中,我已经回收了我们之前创建的列表,并在同一个目录中创建了一个新的脚本。 请注意,如果您的文本文件位于不同的目录,则必须在<符号之后提供文件的确切路径。

直到循环声明

bash支持的另一种循环语句是直到结构。 until语句执行循环内的每个命令,直到声明的布尔表达式为false。 这是while语句的完全相反的。

语法1:直到循环与基于算术符号的条件语句

until ((<conditional_statement>))
do
####set of commands
done

我们举个例子:

result=0 
input=0
var=1
until((var > 5))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

语法2:直到循环语句与基于助记符的条件语句

<initialization>
until [ <condition> ]
do
     ####your code goes here
<increment/decrement>
done

由于until语句与循环语句相反,您还可以在until结构中声明一个基于助记符的条件语句。 但是,为了终止你必须声明一个相反的条件语句 - 也就是说,使条件语句求值为false。

!/bin/bash 
result=0
input=0
var=1
until [ $var -gt 5 ]
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

结论

本教程部分介绍bash支持的三个循环结构 - forwhileuntil循环语句。 这些陈述中的每一个都有不同的结构,用法和优点。 bash支持不同的结构,为程序员提供更多的选择,从而使shell脚本易于编码。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏