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

}

相关文章
|
22天前
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
43 18
|
7月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
150 4
|
7月前
|
分布式计算 Hadoop Shell
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
107 3
|
8月前
|
安全 Linux 测试技术
Kali Linux预装的自动化渗透测试工具
Kali Linux预装的自动化渗透测试工具
345 2
|
9月前
|
Ubuntu Linux 持续交付
在Linux中,如何在Linux中使用Ansible进行自动化部署?
在Linux中,如何在Linux中使用Ansible进行自动化部署?
|
9月前
|
存储 监控 Linux
|
9月前
|
运维 Linux 持续交付
在Linux中,如何进行配置管理和自动化部署?
在Linux中,如何进行配置管理和自动化部署?
|
9月前
|
存储 Linux 测试技术
在Linux中,如何使用expect进行自动化交互式应用程序测试?
在Linux中,如何使用expect进行自动化交互式应用程序测试?
|
9月前
|
jenkins Linux 持续交付
在Linux中,如何使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)?
在Linux中,如何使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)?
|
9月前
|
Java Shell Linux
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
关于如何使用Shell脚本来解析Linux系统中的应用服务日志,提供了脚本实现的详细步骤和技巧,以及一些Shell编程的技能扩展。
165 0
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志