禅道博客

分享专业技术知识,文章内容干货满满

《Linux命令行与shell脚本编程大全》第十三章-学习笔记

2022-10-10 10:00:00
李慧芳
原创 112
摘要:本文主要是对《Linux命令行与shell脚本编程大全》第十三章中的for命令、while 命令的笔记总结。

1.for命令

for命令的基本格式如下:

for var in list

do

commands

done

在每次迭代中,变量var会包含列表中的当前值。第一次迭代会使用列表中的第一个值,第

二次迭代使用第二个值,以此类推,直到列表中的所有值都过一遍。

1.1 读取列表中的值

每次for命令遍历值列表,它都会将列表中的下个值赋给$test变量。

示例2:

$test变量保持了其值,也允许我们修改它的值,并在for命令循环之外跟其他变量一样使用。

1.2 读取列表中的复杂值

示例3:有单引号时,还按照上面的操作时,输出结果就很乱。

有两种办法可解决这个问题:

(1)使用转义字符(反斜线)来将单引号转义;

(2)使用双引号来定义用到单引号的值。

 

使用上述解决方法解决之后的示例如下:

加上转义字符或双引号之后,结果显示正常了。

另一个问题是有多个词的值,for循环假定每个值都是用空格分割的,如果有包含空格的数据值,输出结果就异常了。

示例:

for命令用空格来划分列表中的每个值,如果在单独的数据值中有空格,就必须用双引号将这些值圈起来。

1.3 从变量读取列表

可以通过for命令完成便利整个列表的任务。

1.4 从命令读取值

for命令仍然以每次一行的方式遍历了cat命令的输出,假定每个内容都是在单独的一行上。但这并没有解决数据中有空格的问题。

1.5 更改字段分隔符

bash shell会将下列字符当作字段分隔符:

(1)空格

(2)制表符

(3)换行符

看到了这些字符中的任意一个,它就会假定这表明了列表中一个新数据字段的开始。

但是在处理可能含有空格的数据时还是比较麻烦。

现在,shell脚本旧能够使用列表中含有空格的值了。

1.6 用通配符读取目录

文件扩展匹配是生成匹配指定通配符的文件名或路径名的过程。如果不知道所有的文件名,可以使用文件扩展匹配。

示例:

for命令会遍历/home/lihuifang/*输出的结果。

上述示例中注意if [ -d "$file" ] 中的file需要使用双引号括起来,不然执行时会有问题。

也可以在for命令中列出多个目录通配符,将目录查找和列表合并进同一个for语句。

示例如下:

2.while 命令

2.1 while 的基本格式

while命令的格式是:

while  test command

do

other commands

done

while命令的关键在于所指定的test command的退出状态码必须随着循环中运行的命令而

改变。如果退出状态码不发生变化, while循环就将一直不停地进行下去。

最常见的test  command的用法是用方括号来检查循环命令中用到的shell变量的值。

2.2 使用多个测试命令

while命令允许你在while语句行定义多个测试命令。只有最后一个测试命令的退出状态码

会被用来决定什么时候结束循环。

示例:

2.3 until 命令

until命令和while命令工作的方式完全相反。

until命令的格式如下。

until test  commands

do

other commands

done

示例如下:

2.4 嵌套循环

循环语句可以在循环内使用任意类型的命令,包括其他循环命令,这种循环叫作嵌套循环。

示例:在for循环中嵌套for循环。

这个被嵌套的循环(也称为内部循环,inner loop)会在外部循环的每次迭代中遍历一次它所

有的值。

在混用循环命令时也一样,比如在while循环内部放置一个for循环。

2.5 循环处理文件数据

遍历存储在文件中的数据,可以使用两种技术:

(1)使用嵌套循环

(2)修改IFS环境变量

2.6 控制循环

2.6.1 break 命令

break命令是退出循环的一个简单方法。可以用break命令来退出任意类型的循环,包括

while和until循环。

(1) 跳出单个循环

在shell执行break命令时,它会尝试跳出当前正在执行的循环。

for循环通常都会遍历列表中指定的所有值。但当满足if-then的条件时,shell会执行break

命令,停止for循环。

(2)跳出内部循环

在处理多个循环时,break命令会自动终止你所在的最内层的循环。

(3)跳出外部循环

有时你在内部循环,但需要停止外部循环。break命令接受单个命令行参数值:

break  n

其中 n指定了要跳出的循环层级。默认情况下, n为1,表明跳出的是当前的循环。如果你将

n设为2,break命令就会停止下一级的外部循环。

这里不再举例。

2.6.2 continue 命令

continue命令可以提前中止某次循环中的命令,但并不会完全终止整个循环。

和break命令一样,continue命令也允许通过命令行参数指定要继续执行哪一级循环:

continue  n

其中 n定义了要继续的循环层级。

发表评论
评论通过审核后显示。