Chapter10 更结构化的命令

更新时间:2023-11-26 12:23:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Chapter10 更结构化的命令

在以往的章节中,你看到如何通过检查命令的输出和变量的值来处理一个脚本程序的流程。在这一章节中,我们将会继续观察结构化的命令去控制你的脚本的流程。你将看到如何执行重复的过程,通过一组命令,直到一个指示条件已经满足的命令,可以循环。本章讨论和论证原因,同时,直到给出bash shell循环指令。

The for Command

迭代通过一系列命令是常见的编程实践。你经常需要重复一组命令直到一个特殊的状况出现,例如,处理所有的文件,在一个目录中,所有的用户在一个系统,或所有的行中的文本文件。

bash shell提供命令允许你通过一系列的价值观创建一个循环迭代。每一次迭代中,使用一系列的值的命令集,执行定义命令bash shell的基本格式如下:

你提供了一系列的值可用于列表参数的迭代中。这儿有很多不同的方法可以让你明确指出在列表中的值。

Part 2 Shell Scripting Basics(外壳脚本基础)

在每一个循环中,变量

var包含列表中的当前值。第一个循环使用列表中的

第一个值,第二个循环使用第二个值等等,直到列表中的数字都被用过。

我提到,这儿有很多不同的方法可以让你明确指出在列表中的值。接下来部分将展示各种不同的方法。

Reading values in a list (读取列表中的值)

该命令最基本的用法是迭代列表内的命令本身定义的值:

每一次执行命令迭代列表中提供的值,它将分配测试变量给列表中的下一个值。可以使用$文本变量,就像在命令语句中的任何其他脚本变量一样。经过最后一次迭代,$测试变量在整个壳脚本的其余部分仍然有效。它保留最后迭代的值(除非你改变它的值):

$测试变量保留它的值,并且允许我们改变它的值和使用它外面的命令循环作为任何其他变量。

Reading complex values in a list(在一个列表中读取复杂)

事情并不总是像他们的循环那样看起来那么简单。当你运行数据的时候他们

很多次会出现问题。这儿有一个典型的案例会引起外壳脚本程序问题:

外壳脚本看到了单引定义在这列值中并且尝试用他们去定义一个单引号的数值。在这个过程中,程序被破坏了。

以下有两种方法解决这个问题: 1、使用换码符避免单引号出现。 2、用双引号定义单引号的值。

这两种方法都不是最好的,但都可帮助去解决这个问题:

在第一个问题值中,在错误的值时我增加了反斜杠字符避开单引号。在第二个问题值中,我附入this'll 值在双引号中。两种方法都可以很好的区分值。

另一个问题是你运行出来的值都可能是多值的。记住,循环语句表明,每一个值被划分为一个空格。如果您有包含空格的数据值,你将会运行出另一个问题:

这并不完全是你想要的。命令将列表中的每个值用空格分开。如果单个数据值中有空格,你必须用双引号来调整他们:

现在,命令可以在不同的值中准确的区分。而且,注意,如果在一个值附近使用双引号,外壳脚本不包括双引号作为值的一部分。

Reading a list from a variable(从变量中读取列表)

在一个外壳脚本中常发生的是你累积了一个存储的值列表在变量中和迭代这个列表。你也可以通过命令去做:

$列表变量包含用于迭代的标准文本列表的值。注意的是,该代码还使用另一个赋值语句将该项目添加到列表中包含的$列表变量中。这是一种常见的方法将文本添加到现有文本的结尾的存储变量。

Reading values from a command (从命令读取值)

还有一种用于在列表中生成值的方法是使用一个命令的输出。你用反引号字符来执行任何命令,产生的输出,然后在命令中使用该命令的输出:

这个例子使用了cat命令来显示文件状态的内容。你会注意到该状态文件包含一个单独的行中的每个状态,不被空格隔开。命令将一直依次循环访问cat命令在一列值中的输出,判断每一个状态在独立的列。但是,这并不能解决在数据中有空格这个问题。如果你列出了一个状态中有一个空格,命令将仍以每个字作为一个独立的值。这是有一个理由的,我们会在下章看到。

Changing the field separator(改变字段分隔符)

这个问题的起因是特殊环境变量IFS,称为内场分离器。IFS环境变量定义一列字bash shell使用场分离。默认情况下,Bash shell认为以下字符作为字段分隔符: 1、一个空格 2、一个标签 3、一个新行

如果bash shell在数据中看到这些任何字符,它将会认为你将在列表中开始一个新的数据场。当处理数据时包含空格(例如文件名),这很麻烦,正如你先前在脚本案例中看到的一样。为了解决这个问题,在你的外壳脚本中,你可以暂时改变ISF环境变量的值来限制字符的bash shell识别为字段分隔符。但是,这儿有个有点奇怪的方式来解决这个问题。例如,如果你想改变ISF的值去唯一的识别一个新行的字符,你将要做以下的事情:

IFS=’\\n’

增加这个状态在你的脚本中表明,bash shell忽视空格和标签在数据值中。把这个应用到前面的脚本,形式如下:

现在,外壳脚本可能在列表中使用包含空格的值。这儿有ISF环境变量更优秀的应用。你想迭代文件中的所有值,可以用冒号分开。所有你需要去做的就是去设置ISF值给一个冒号:

ISF= :

如果你想指定一个以上的ISF的特征,只是它们串在一起的作业线:

IFS=$’\\n’ : ; ”

本文使用换行符,冒号,分号,双进行标记字符作为字段分隔符。这儿没有限制你如何使用ISF字符分析你的数据。

Reading a directory using wildcards(阅读目录使用通配符)

最终,你可以使用命令去自动迭代文件目录。为此,你必须使用一个在文件或路径名通配符。这迫使外壳使用文件通配符。文件通配符是生产的文件或路径名指定通配符匹配的过程。

当你不知道所有的文件夹时,这一功能有利于在一个目录中处理文件:

该命令迭代了home / rich / test /的结果。代码使用测试命令测试每个输入去看它是一个目录或一个文件。

注意在这个例子中我做的有点不同如果测试:

在Linux中目录和文件名包含空格是完全合法的。适应的,在双引号中你应该附上$文件变量。如果没有,如果运行一个文件或目录包含空格,你会得到一个错误的指令:

bash shell解释附加词作为参数在测试命令,导致一个错误。

你也可以把目录搜索方法和列表方法在相同的声明中,通过列出一系列命令的目录的通配符:

for语句首先使用文件globbing遍历列表文件,结果从通配符,那么它遍历列表中的下一个文件。你可以将任意数量的通配符遍历列表中的条目。

The C-Style for Command(c风格的命令)

如果你用C程序语言做任何人程序,你大概会因为bash shell使用的命令感到惊讶。在C语言中,一个for循环通常定义一个在每次迭代中自动地改变的变量。通常的,程序员们用这个变量作为一个计数器,也会在每次迭代中增加或递减计数器。指令的bush也可以提供这个功能。本节展示如何使用一个c风格的命令在bash shell脚本。 C语言指令

C语言指令有一个特定的方法用于指定一个变量,一个必须为迭代的继续保持真实的条件,和一种为每次迭代改变变量的方法。当指定的条件出错时,for循环停止。条件方程用标准的数学符号定义。例如,取C语言代码:

这个代码产生一个简单的迭代循环,在那里变量i被用来作为一个计数器。第一部分分配一个默认值给变量,第二部分定义条件在循环迭代的下面。当定义条件错误时,for循环停止迭代。最后一部分定义迭代过程。在每次迭代后,表达式定义在最后一部分是已执行的。

Bash shell也支持for循环中的变量和C风格的for循环差不多,虽然它有一些细微的差别,包括一些事情会让shell脚本程序员困惑。这是C风格bash for循环的基本格式

C风格bash for循环的格式能让bash shell脚本程序员困惑,因为它用C风格变量参照代替shell风格变量参照。这是C风格for指令:

注意接下来的是不遵循bash shell方法的标准的一些事情: 1、变量的赋值可以包含空格。 2、条件变量不在一个$符号之前。

3、迭代过程的方程不用expr命令格式。

外壳开发者创建这种格式更接近命令的风格。而这对于C程序员是伟大的,它可以把甚至专家壳程序员欣喜若狂。当使用C风格在你的脚本环小心。

for循环遍历用在for循环中定义的变量的命令(这封信我的例子),在每次迭代中,$我变量包含在for循环中分配的值。在每一次迭代,迭代过程中应用到的变量,在这个例子中,变量的增量一个。

Using multiple variables(使用多个变量)

指挥的风格也允许你使用多个变量的迭代循环处理的每个变量,允许您定义的每个变量不同的迭代过程。而你可以有多个变量,你可以在for循环中定义一个条件:

The while Command(while命令)

while命令在一定方面是if-then语句和for循环之间的交叉。while命令允许你定义一个命令,通过一组命令测试,然后循环,只要所定义的测试命令返回零退出状态。它在每次迭代开始测试命令。当测试命令返回一个非零的退出状态,将同时命令停止执行的命令集。

在while命令的格式是:

在while命令中,测试命令定义是完全一样的格式中的if-then语句(见第9章)。正如在if-then语句中,你可以使用任何正常的bash shell命令,或者您可以使用测试命令来测试条件,如变量值。

While命令语句的关键是指令必须改变测试命令的退出状态,根据这些命令在循环过程中运行。如果退出状态不会改变,while循环会陷入无限循环。

在大多数命令的场合下使用测试命令括号来检查在循环使用的命令shell变量的值:

本文来源:https://www.bwwdw.com/article/77nt.html

Top