Linux程序设计(Linux shell编程六)

各位看官,前两回咱们 分别说了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程序

结构的内容就结束了,欲知后事如何,且听下回分解。

你可能感兴趣的:(Linux程序设计)