Linux集群和自动化维2.3 Shell中的控制流结构-阿里云开发者社区

开发者社区> 华章出版社> 正文

Linux集群和自动化维2.3 Shell中的控制流结构

简介:

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

}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接