2.3 Shell中的控制流结构
Shell中的控制流结构也比较清晰,如下所示:
if ...then...
else...fi语句
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
}