欢迎来到youcl的shell脚本教程系列的第四部分(点击此处阅读本教程的第1 部分,第2 部分和第3部分)。 在这部分中,我们将介绍bash shell的不同重复控制结构以及如何通过一些例子来使用每个结构。 让我们开始吧。
介绍
重复控制结构,也称为循环控制结构,是用于简化重复或递归任务的编程语言中的一种控制结构。 循环语句通过提供一种最小化代码的方式来优化任何代码,使其比提供相同输出的非结构化代码更易于排除故障。 bash shell支持三种类型的循环语句 - for
, while
和until
循环。
循环
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的
初始化开始。 接下来,布尔测试在关键字之后声明,
并且要重复的语句集将在do
和done
语句内声明。 在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支持的三个循环结构 - for
, while
和until
循环语句。 这些陈述中的每一个都有不同的结构,用法和优点。 bash支持不同的结构,为程序员提供更多的选择,从而使shell脚本易于编码。