9.1. for 循环

9.1.1. 它是如何工作的?

for 循环是 shell 三种循环结构中的第一个。此循环允许指定一个值列表。对于列表中的每个值,都会执行一系列命令。

此循环的语法是

for名称[in 列表]; do 命令; done

如果 [in LIST] 不存在,它将被替换为 in $@,并且 for 会对每个已设置的位置参数执行一次 COMMANDS(参见 第 3.2.5 节第 7.2.1.2 节)。

返回状态是最后执行的命令的退出状态。如果没有命令被执行,因为列表没有扩展为任何项,则返回状态为零。

名称可以是任何变量名,尽管i经常被使用。列表可以是任何单词、字符串或数字的列表,可以是字面值,也可以由任何命令生成。要执行的 COMMANDS 也可以是任何操作系统命令、脚本、程序或 shell 语句。第一次循环时,名称被设置为 中的第一个项目列表。第二次,它的值被设置为列表中的第二个项目,依此类推。当循环终止时,名称已经取了来自 的每个值列表并且在 中没有剩余项目列表.

9.1.2. 示例

9.1.2.1. 使用命令替换来指定 LIST 项

第一个是命令行示例,演示了如何使用 for 循环来备份每个.xml文件。发出命令后,可以安全地开始处理你的源代码

[carol@octarine ~/articles] ls *.xml
file1.xml  file2.xml  file3.xml

[carol@octarine ~/articles] ls *.xml > list

[carol@octarine ~/articles] for i in `cat list`; do cp "$i" "$i".bak ; done

[carol@octarine ~/articles] ls *.xml*
file1.xml  file1.xml.bak  file2.xml  file2.xml.bak  file3.xml  file3.xml.bak

这个例子列出了 /sbin 中的文件/sbin这些文件是纯文本文件,也可能是脚本

for i in `ls /sbin`; do file /sbin/$i | grep ASCII; done

9.1.2.2. 使用变量的内容来指定 LIST 项

以下是一个特定的应用程序脚本,用于将符合特定方案的 HTML 文件转换为 PHP 文件。转换是通过取出前 25 行和后 21 行,并将它们替换为提供页眉和页脚行的两个 PHP 标签来完成的

[carol@octarine ~/html] cat html2php.sh
#!/bin/bash
# specific conversion script for my html files to php
LIST="$(ls *.html)"
for i in "$LIST"; do
     NEWNAME=$(ls "$i" | sed -e 's/html/php/')
     cat beginfile > "$NEWNAME"
     cat "$i" | sed -e '1,25d' | tac | sed -e '1,21d'| tac >> "$NEWNAME"
     cat endfile >> "$NEWNAME"
done

由于我们这里没有进行行计数,因此无法知道从哪一行开始删除行直到结尾。这个问题通过使用 tac 来解决,它可以反转文件中的行。

Tipbasename 命令
 

与其使用 sed 来替换html后缀为php,更简洁的方法是使用 basename 命令。阅读 man 手册以获取更多信息。

Warning特殊字符
 

如果列表扩展为包含空格和其他不规则字符的文件名,你将遇到问题。获取列表更理想的结构是使用 shell 的 globbing 功能,像这样

for i in $PATHNAME/*; do
	commands
done