各位看官,前两回咱们 分别说了Linux shell编程中的顺序结构和判断结构,今天咱们接着说另外一个
结构:循环结构。闲话休说,言规正转。
看官们,是不是还沉浸在上一回的test专场中呢,咱们这一回的内容和第四回的内容是相互照应的,还
记得第四回中的顺序结构和判断结构吧,这一回的内容是循环结构。
其实循环结构中的while和until在test专场中已经说过了。因此,今天只是提一句,它们两个也是循环
结构中的成员,大家不要忘记他们。下面请出今天的主角是for。for命令格式for 变量 列表,其它的先
不写。for主要用来循环做某件事情,但是循环的次数与取决于列表中内容,因此for还有一个作用就是用
来遍历列表。从列表开始直到列表结束,而且每次遍历都时变量的值等于列表中的元素。这个列表,可以
是自己定义的内容,比如随便写一串字符,也可以是某个变量的值。我们甚至可以把命令的结果当作列表,
比如ll,ps等命令都有结果。下面就来举几个例子来说明for的用法。
#! /bin/bash
echo "-----------------the starting line of shell-----------------"
for day in Monday Tuesday Wednesday Thursday Friday
do
echo "Today is $day, Don't forget to have a breakfast"
done
echo "-----------------the ending line of shell-----------------"
新建立一个名叫t1.sh的脚本文件,把上面的内容输入到文件中,保存后,给文件加上执行权限,然后在
终端中运行该文件,并用依据程序提示输入内容得到以下结果:
-----------------the starting line of shell-----------------
Today is Monday, Don't forget to have a breakfast
Today is Tuesday, Don't forget to have a breakfast
Today is Wednesday, Don't forget to have a breakfast
Today is Thursday, Don't forget to have a breakfast
Today is Friday, Don't forget to have a breakfast
-----------------the ending line of shell-----------------
看官们,从上面的程序中可以看到变量day,依次遍历了列表中的每一个元素。我们充分利用它的遍历特
性,输出了列表中的元素。不过我们也不能忘记循环的本质:重复地做某件事情。上面的程序就是重复地
提醒吃早餐。“哎呀,你这么说,我倒是有点饿了“。看来这位看官没有吃早餐呀,看来这个程序非常适合
你呢。哈哈。。。台下笑成一片。
刚才咱们也说了,列表可以自己定义内容,也可以是变量的值。上面例子中的列表就是自定义的内容,下
面咱们举个把变量当作列表的例子。
#! /bin/bash
echo "-----------------the starting line of shell-----------------"
week="Monday Tuesday Wednesday Thursday Friday"
for day in $week
do
echo "Today is $day, Don't forget to have a breakfast"
done
echo "-----------------the ending line of shell-----------------"
新建立一个名叫t2.sh的脚本文件,把上面的内容输入到文件中,保存后,给文件加上执行权限,然后在
终端中运行该文件,并用依据程序提示输入内容得到以下结果:
-----------------the starting line of shell-----------------
Today is Monday, Don't forget to have a breakfast
Today is Tuesday, Don't forget to have a breakfast
Today is Wednesday, Don't forget to have a breakfast
Today is Thursday, Don't forget to have a breakfast
Today is Friday, Don't forget to have a breakfast
-----------------the ending line of shell-----------------
看官们对比一下t1中程序的结果,你会发现,程序t1和t2的结果完全一样。是的,咱们只是修改了列表的
的表达形式,其它的内容没有改变,结果当然相同了。
看官们,我在这里给大家提个醒。如果列表的元素中有空格或者引号等特殊字符。需要使用转义字符,或
者把内容用双引号包住。比如我们经常使用的don't,可以这样写:don\'t或者"don't".这么做是有原
因的。因为bash默认使用空格,制表符或者换行符来分隔列表中的元素。它只要看到其中任何一个,就开
始分隔列表中的元素。
bash中的这些分隔符其实是通过一个叫做内部字段分隔符的变量(internal field separator)控制着,该变
量简称IFS,分隔符就是该变量的值,使用set命令可以查看到IFS的内容。如果我们想自己定义一些分隔符,
那么我们可以临时修改IFS的默认值,让它按照我们的要求来分隔列表中的变量,不过,使用完以后,要恢
复原来的默认值。因为你修改了以后,它的值不是默认值,这样会影响系统中的其它使用。下面我们来个
例子说明一下。
#! /bin/bash
echo "-----------------the starting line of shell-----------------"
week="Monday,Tuesday,Wednesday,Thursday,Friday"
for day in $week
do
echo "Today is $day, Don't forget to have a breakfast"
done
echo "-----------------the ending line of shell-----------------"
新建立一个名叫t3.sh的脚本文件,把上面的内容输入到文件中,保存后,给文件加上执行权限,然后在
终端中运行该文件,并用依据程序提示输入内容得到以下结果:
-----------------the starting line of shell-----------------
Today is Monday,Tuesday,Wednesday,Thursday,Friday, Don't forget to have a breakfast
-----------------the ending line of shell-----------------
大家看到了吧,咱们使用逗号分列表中的元素,这个程序就不能正常遍历了,而且不能每天提醒我们吃早
餐。咱们来修改一下,让程序能够遍历列表中以逗号分隔的元素。
#! /bin/bash
echo "-----------------the starting line of shell-----------------"
old=$IFS
IFS=","
week="Monday,Tuesday,Wednesday,Thursday,Friday"
for day in $week
do
echo "Today is $day, Don't forget to have a breakfast"
done
IFS=$old
echo "-----------------the ending line of shell-----------------"
新建立一个名叫t4.sh的脚本文件,把上面的内容输入到文件中,保存后,给文件加上执行权限,然后在
终端中运行该文件,并用依据程序提示输入内容得到以下结果:
-----------------the starting line of shell-----------------
Today is Monday, Don't forget to have a breakfast
Today is Tuesday, Don't forget to have a breakfast
Today is Wednesday, Don't forget to have a breakfast
Today is Thursday, Don't forget to have a breakfast
Today is Friday, Don't forget to have a breakfast
-----------------the ending line of shell-----------------
大家看看程序运行的结果,这不正是我们想要的结果吗。大家现在能体会到IFS的作用了吧。
看官们,咱们刚才的例子中把自己定义内容当作列表,也把变量的值当作列表,咱们现在再举一个例子说
明如何把程序的运行结果当作列表。
首先把打开Gedit,并且输入:Monday Tuesday Wednesday Thursday Friday。然后把这些内容保
存到一个名叫week.txt的文件中。
#! /bin/bash
echo "-----------------the starting line of shell-----------------"
for day in `cat week.txt`
do
echo $day
done
echo "-----------------the ending line of shell-----------------"
新建立一个名叫t5.sh的脚本文件,把上面的内容输入到文件中,保存后,给文件加上执行权限,然后在
终端中运行该文件,并用依据程序提示输入内容得到以下结果:
-----------------the starting line of shell-----------------
Monday
Tuesday
Wednesday
Thursday
Friday
-----------------the ending line of shell-----------------
看官们,上面的例子中,咱们把cat命令的结果当作了列表,并且遍历了列表中的元素。注意这里需要使
用反引号把命令包住,这样才能执行命令。
看官们,到现在为止,咱们把shell的三种程序结构:顺序结构,条件判断结构和循环结构都说完了。今
天做个总结。咱们首先说的是三种程序结构的形式和作用。接着说了如何使用这三种程序结构以及使用这
三种程序结构时的注意事项。当然,咱们在说的过程中都通过举例子进行了说明。看官们,关于shell程序
结构的内容就结束了,欲知后事如何,且听下回分解。