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


$ cd ~/example
$ ls
A B C
$ for file in C B B C
> {
> echo $file
> }
C
B
B
C
$
要对同一目录下的所有文件执行操作,可以使用星号 (*) 作为循环的唯一成员,如清单 24 中所示 。Shell 将星号扩展为目录中的所有文件 。然后,对于循环中您要对所有文件执行的命令,使用 loopname 变量作为合适的参数或选项 。
清单 24. 针对目录中的所有文件执行同一命令
$ ls
A B C
$ for file in *
> {
> mv $file $((0x$file))
> }
$
如果您正在运行本教程中的所有示例,那么您的 example 目录中的内容应该已改变:
$ ls
10 11 12
$
发生的情况是循环中的 mv 命令将文件的名称从十六进制值(通过在名称的前面插入 0x 构成)更改为与它相等的十进制值 。
构造 while 循环
您可以构造一种当满足某些条件就一直运行的循环 。使用 while 条件语句来实现这一目标,其格式如清单 25 所示 。
清单 25. Shell while 循环的结构
while [ condition ]; do
command;
command;
...
command;
done
在循环中,condition 可以是使用操作符(请参见表 3)构建的语句,或者可以像一个变量名那样简单 。只要值是非 0 的,就代表真 。
表 3. 常用 Shell 操作符
操作符描述-eq 等于-ne 不等于-lt 小于-le 小于等于-gt 大于-ge 大于等于
构造 while 循环时,有一些注意事项需要牢记在心 。首先,在条件与将它括起来的括号之间必须留有空白字符 。其次,如果在条件中将变量用于数字比较,那么在 while 语句之前必须首先定义该变量 。
键入清单 26 中的文本以执行一个简短的 while 循环:
清单 26. 使用 while 循环更改变量
$ VAR=0
$ while [ $VAR -lt 10 ]; do
>echo $VAR;
>VAR=$(($VAR 1));
> done
0
1
2
3
4
5
6
7
8
9
$
构造 until 循环
until 条件语句与 while 相似并使用相同的操作符,但是它们的行为相反 。它只有当条件为假时才执行循环,并且循环持续重复直到 给定的条件为真 。它的格式在清单 27 中说明 。
清单 27. Shell until 循环的结构
until [ condition ] ; do
command;
command;
...
command;
done
通过键入清单 28 中所示的内容尝试运行一个简短的 until 循环:
清单 28. 使用 until 循环更改变量
$ VAR=10
$ until [ $VAR -eq 0 ]; do
>echo $VAR;
>VAR=$(($VAR-1));
> done
10
9
8
7
6
5
4
3
2
1
$
嵌套多重循环
您可以嵌套循环和组合多种类型的循环来执行各种类型的复杂操作 。由于 for 循环的成员不必是数字或以任意类型的顺序排列,因此您可以使用稍后在某个内部循环中作为命令执行的命令名称作为其成员,比如 printf、echo、stop、resume,等等 。
尝试运行清单 29 中的示例 。这是一个执行算术替换的 until 循环,同时嵌套在循环词未按数字顺序排列的 for 循环内部 。
清单 29. 使用嵌套循环进行算术替换
$ for i in 250 100 2136 875
> {
>VAR=10;
>until [ $VAR -eq 0 ]; do
> echo "$i / $VAR = $(($i/$VAR)) $i * $VAR = $(($i*$VAR))
$i$VAR = $(($i $VAR)) $i - $VAR = $(($i-$VAR))";
> VAR=$(($VAR-1);
>done;
> }
250 / 10 = 25 250 * 10 = 2500 25010 = 260 250 - 10 = 240
250 / 9 = 27 250 * 9 = 2250 2509 = 259 250 - 9 = 241
250 / 8 = 31 250 * 8 = 2000 2508 = 258 250 - 8 = 242
250 / 7 = 35 250 * 7 = 1750 2507 = 257 250 - 7 = 243

推荐阅读