第十五章、Shell 的循环结构

1. for 命令

for 命令在 shell 脚本中用于遍历给定的字符串列表,绑定变量后再执行命令块。

for 命令又叫迭代循环命令,他只能对优先的数据集合进行遍历,比如字符串列表等。

名词解释

for 命令的作用

遍历一组给定的字符串列表(使用空白字符分隔,如:空格,换行等)。

官方语法

for NAME [in WORDS ... ] ; do COMMANDS; done

上述 中括号([ ])内部的数据是可选的。WORDS 后跟 ... 说明前面的 字符串 WORDS 可以有零个、一个或多个。 WORDS ... 后面的分号 ; 表示 字符串列表的结束,如果后面 do 写在新的一行内,则 分号; 可以省略。

将上述一行整理成多行,并用中文表达需要填充的部分,即成为如下语法:

语法格式:

for 变量名 [in 字符串1 字符串2 ... ; ] do
    命令块;
done

for 变量名 [in 字符串1 字符串2 ...]
do
    命令块;
done

语法说明:

示例:

写一个 Shell 程序 test_for.sh ,实现遍历给定的字符串:

#!/bin/bash
for STRING in AAA BBB "CCC ccc" DDD
do
    echo ${STRING}
done

执行结果

weimingze@mzstudio:~$ bash test_for.sh
AAA
BBB
CCC ccc
DDD

示例2

写一个 Shell 程序 test_for2.sh ,遍历 /etc/ 文件夹下所有名为 passwd 的文件,并将其内容合并到文件当前文件夹下的 passwd.txt 文件。

#!/bin/bash
for PATHNAME in $(find /etc/ -name "passwd" 2> /dev/null)
do
    echo "find: ${PATHNAME}"
    cat ${PATHNAME} >> passwd.txt
done

执行结果

weimingze@mzstudio:~$ bash test_for2.sh
find: /etc/pam.d/passwd
find: /etc/passwd
weimingze@mzstudio:~$ cat passwd.txt
#
# The PAM configuration file for the Shadow `passwd' service
#

@include common-password

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin

练习:

写一个 Shell 脚本程序 stat_dir.sh 实现如下的功能。

#!/bin/bash
# 定义一个文件夹列表:"/etc /usr/include /home"
# 使用 for 循环 打印出上述文件夹所占用的存储空间的大小(以 KB 位单位),并打印出结果。