目录
摘要
完成本章后,你将能够
使用 for, while 和 until 循环,来决定什么场合使用什么循环
使用Bash内建命令的 break 和 continue
使用 select 语句来写脚本
编写可变参数数量的脚本
for 循环是3个shell循环结构中的第一个。这个循环允许指定一个值的列表。列表中的命令为每个在列表中的值执行。
这个循环的语法结构是这样的:
for
NAME
[in LIST ]; do COMMANDS; done
如果 [in LIST] 不存在的话,就使用 in $@
替换且 for 对每个位置参数执行一次 COMMANDS (参见 第 3.2.5 节 “特殊参数” 和 第 7.2.1.2 节 “检查命令行参数”).
返回值为最后执行命令的退出状态。如果由于没有 LIST
中没有任何项目就不执行命令,返回值是零。
NAME
可以使任何变量的名字,虽然 i
的使用非常普遍。 LIST
可以是任何字的列表,字符串和数字,命令生成。执行的 COMMANDS 也可以是任何操作系统命令,脚本,程序或者shell语句。第一次执行循环的时候,NAME
设置为LIST
中的第一个项目。第二次,它的值设置成列表中的第二个项目,以此类推。当 NAME
得到了在 LIST
中所有的值之后循环中止。
第一个是命令行例子,证明 for 循环的使用来为每个 .xml
文件做备份。执行了这个命令之后,在你的源代码上工作就变得很安全:
[carol@octarine ~/articles]
ls*.xml
file1.xml file2.xml file3.xml[carol@octarine ~/articles]
ls*.xml
>list
[carol@octarine ~/articles]
fori
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
中的正好是纯文本的文件,这是可能的脚本:
for i
in `ls /sbin`
; do file /sbin/$i
| grep ASCII
; done
以下是一个特别的应用脚本来转换适应一个特定的schema的HTML文件到PHP文件,转化通过取出最初的25行和最后的21行,用PHP标签替换来提供页眉和页脚来完成的:
[carol@octarine ~/html]
cathtml2php.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, 它将在文件中保留行。