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定义了要继续的循环层级。