UNIX 新手指南: 一些很好的 Shell 诀窍( 六 )


尝试在您的 home 目录键入清单 17 中显示的内容 。该示例创建一个 example 目录和一些测试文件,前提是原来不存在 example 目录 。
清单 17. 在 Subshell 中创建一组文件
$ pwd
/home/user
$ (mkdir example; cd example; touch A B C)
$ pwd
/home/user
$ cd example; ls
A B C
$ pwd
/home/user/example
$
在本例中,Shell 生成一个在后台运行的 Subshell,建立 example 目录,然后使用 touch 在该目录中生成三个虚拟文件 。同时,Shell 返回 home 目录的命令行 。
当您有一组执行时间长的命令时,在命令行和脚本中使用 Subshell 都很方便 。为了让 Shell 保持空闲,您可以在后台运行 Subshell,或者在后台运行许多个 Subshell 。
( group-of-long-running-commands ) &
( another-group-of-long-running-commands ) &
( yet-another-group-of-long-running-commands ) &
Subshell 和变量
理解变量与 Subshell 的交互方式非常重要 。因为 Subshell 环境是其父亲的副本,所以它继承了父亲的所有变量 。但是父 Shell 从不会看到 Subshell 环境发生的任何变化,同样,Subshell 生成以后,再也不会看到父亲发生的任何变化 。
作为示例,使用 vi 编辑器将清单 18 中的脚本保存到 home 目录的 vartest 文件中,然后将其设置为可执行(请参见编写 shell 脚本部分) 。
清单 18. 演示 Subshell 中变量行为的 Shell 脚本
#!/bin/sh
# Demonstrates variable behavior in a subshell environment
VAR=10
echo "VAR is" $VAR
(
echo "In the subshell, VAR is still" $VAR
VAR=$(($VAR 5))
echo "The new value of VAR in the subshell is" $VAR
)
echo "Outside of the subshell, VAR is" $VAR
现在尝试通过键入脚本的名称来执行它,如清单 19 中所示 。
清单 19. vartest 脚本的输出
$ vartest
VAR is 10
In the subshell, VAR is still 10
The new value of VAR in the subshell is 15
Outside of the subshell, VAR is 10
$
连续循环
现在来看循环,它允许您执行重复任务,比如对一组文件执行一些操作或命令 。Shell 有几种构造循环的方法 。
构造 for 循环
最常见的循环结构是 for 循环 。首先定义一个变量作为循环的名称,提供一组成员,可以是包括整数和文件名在内的任何单词,然后提供每次重复执行的命令 。每个命令都以分号结束 (;),整个命令组以位于单词 do 和 done 之间 。清单 20 描述了它的结构 。
清单 20. Shell 中循环的结构
for loopname in members
do
command;
command;
...
command;
done
在循环的第一次重复中,loopname 变量获取第一个成员的值 。然后 loopname 的值被清单中下一个成员的值替代,接下来它继续重复直到遍历所有成员 。
在大多数 Shell 中,do 和 done 都可以被大括号所替代,如清单 21 中所示 。
清单 21. Shell 循环的替代结构
for loopname in members
{
command;
command;
...
command;
}
键入清单 22 中的文本来运行包含三个成员的简单循环:
清单 22. 使用循环来改变变量的值
$ for i in 1 2 3
> {
> VAR = $(($VAR $i))
> echo $i:$VAR
> }
1:1
2:3
3:6
$
针对目录中的每个文件执行命令
您可以使用循环针对给定的一组文件执行一个或一组命令 。如果您提供文件的名称作为 for 循环的成员,那么循环按您提供名称的顺序在每个文件上执行操作 。您可以两次提供同一个文件,循环将依次对该文件执行操作 。在您的 example 目录中尝试使用清单 23 中的文本执行上述操作 。
清单 23. 利用一组文件构造循环

推荐阅读