2.3 Shell中的控制流结构

Shell中的控制流结构也比较清晰,如下所示:

·if...then...else...fi语句

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

·case语句

·for循环

·until循环

·while循环

·break控制

·continue控制

工作中用得最多的就是if语句、for循环、while循环及case语句,大家可以以这几个为重点对象来学习。

if语句语法如下:

if 条件

1

then

命令

1

else

命令

2

fi

if语句的进阶用法:

if 条件

1

then

命令

1

else if 条件

2

then

命令

2

else

命令

3

fi

举例说明下if语句的用法,示例如下:

#!/bin/bash

if [ "10" -lt "12" ]

then

echo "10确实比

12小

"

else

echo "10不小于

12"

fi

case语句语法如下:

case 值

in模式

1)

命令

1

;;模式

2)

命令

2

;;

*)

命令

3

;;

esac

case取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有的命令都开始执行直至“;;”。模式匹配符“*”表示任意字符,“?”表示任意单字符,“[..]”表示类或范围中任意字符。

case语句适合打印成绩或用于/etc/init.d/服务类脚本。以下面的脚本为例来说明下。

#!/bin/bash

#case select

echo -n "Enter a number from 1 to 3:"

read ANS

case $ANS in

1)

echo "you select 1"

;;

2)

echo "you select 2"

;;

3)

echo "you select 3"

;;

*)

echo "`basename $0`: this is not between 1 and 3"

exit;

;;

esac

下面是稍为复杂的实例说明,/etc/init.d/syslog脚本的部分代码如下,大家注意case语句的用法,可以以此为参考编写自己的case脚本:

case "$1" in

start)

start

exit 0

;;

stop)

stop

exit 0

;;

reload|restart|force-reload)

stop

start

exit 0

;;

**)

echo "Usage: $0 {start|stop|reload|restart|force-reload}"

exit 1

;;

esac

for循环语句的语法如下:

for 变量名

in 列表

do

命令

done

若变量值在列表里,则for循环执行一次所有命令,使用变量名访问列表并且取值。命令可为任何有效的Shell命令和语句,变量名为任意单词。in列表可以包含列表、字符串和文件名,还可以是数值范围,例如{100..200},举例说明如下:

#!/bin/bash

for n in {100..200}

do

host=192.168.1.$n

ping -c2 $host &>/dev/null

if [ $? = 0 ]; then

echo "$host is UP"

else

echo "$host is DOWN"

fi

done

while循环语句的语法如下:

while条件

do

命令

done

在Linux中有很多逐行读取一个文件的方法,其中最常用的就是下面脚本里的方法(管道法),而且这也是效率最高、使用最多的方法,笔者最喜欢用的也是管道法。为了给大家一个直观的感受,下面将通过生成一个大文件的方式来检验各种方法的执行效率。

在脚本里,LINE这个变量是预定义的,并不需要重新定义,$FILENAME后面接系统中实际存在着的文件名。

管道方法的命令语句如下:

cat $FILENAME | while read LINE

脚本举例说明如下:

#!

/bin/bash

cat test.txt | while read LINE

do

echo $LINE

done

}