for 循环是 shell 三种循环结构中的第一个。此循环允许指定一个值列表。对于列表中的每个值,都会执行一系列命令。
此循环的语法是
for名称[in 列表]; do 命令; done
如果 [in LIST] 不存在,它将被替换为 in $@,并且 for 会对每个已设置的位置参数执行一次 COMMANDS(参见 第 3.2.5 节 和 第 7.2.1.2 节)。
返回状态是最后执行的命令的退出状态。如果没有命令被执行,因为列表没有扩展为任何项,则返回状态为零。
名称可以是任何变量名,尽管i经常被使用。列表可以是任何单词、字符串或数字的列表,可以是字面值,也可以由任何命令生成。要执行的 COMMANDS 也可以是任何操作系统命令、脚本、程序或 shell 语句。第一次循环时,名称被设置为 中的第一个项目列表。第二次,它的值被设置为列表中的第二个项目,依此类推。当循环终止时,名称已经取了来自 的每个值列表并且在 中没有剩余项目列表.
第一个是命令行示例,演示了如何使用 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 |
以下是一个特定的应用程序脚本,用于将符合特定方案的 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 来解决,它可以反转文件中的行。
![]() | basename 命令 |
---|---|
与其使用 sed 来替换html后缀为php,更简洁的方法是使用 basename 命令。阅读 man 手册以获取更多信息。 |
![]() | 特殊字符 | |
---|---|---|
如果列表扩展为包含空格和其他不规则字符的文件名,你将遇到问题。获取列表更理想的结构是使用 shell 的 globbing 功能,像这样
|