shell脚本编程——流程控制

简介:

shell脚本编程——流程控制

目   录

一、 if 

二、 case

三、 for

四、 while

五、 until

六、 综合应用


一、if

  1、语法

            1)单分支

            if  判断条件;then

            fi

            (2)双分支

            if 判断条件; then

                条件为真的分支代码

            else

                条件为假的分支代码

            fi

            (3)多分支

            if 判断条件1; then

                条件为真的分支代码

            elif 判断条件2; then

                条件为真的分支代码

             elif 判断条件3; then

                条件为真的分支代码

             else

                以上条件都为假的分支代码

             fi

        逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句

       2、例子1:编写脚本,实现如下功能:当输入的是自然数,提示是自然数,如果输入不是,则提示,输入不是自然数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# ---------------------------------------------------------------
# Filename:checkint.sh
# Revision:     1.0
# Date:         2017-09-12
# Author:       gm
# Website:
# Description:check int
# -------------------------------------------------------------
read  -p  "please input number: "  num
if  [[  "$num"  =~ [^[:digit:]] ]]; then
         echo  "The number is not a int"
else
         echo  "The number is  a int"
fi

    解释:如果输入的数中匹配到了数字以外的字符,则提示不是自然数,其他情况,则提示是自然数。

        执行结果:

            wKioL1m-EqaQx6hQAAA02FG3meg745.png

二、case

    1、语法

    case 变量引用 in

    PAT1)

    分支1

    ;;

    PAT2)

    分支2

    ;;

    ...

    *)

    默认分支

    ;;

    esac


        case支持glob风格的通配符:

        *: 任意长度任意字符

        ?: 任意单个字符

        []:指定范围内的任意单个字符

        a|b: ab

2、例子2:写出菜单,当用户输入菜单编号,则显示出价格

        

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
# ------------------------------------------
# Filename:   menu.sh
# Revision:   1.0
# Date:       2017-9-11
# Description: cai dan
# ------------------------------------------
echo  "menu
1.tang  
2.rice  
3.fruit  
4.jiaozi       
5.lamian       
6.huimian 
"     
 
read  -p  "plaese input your food  number: "  num
case  $num  in
1|4)
      echo  The price is 20
 
      ;;
2|5)
      echo  The price is 12
      ;;
3|6) 
      echo  The price is 10
      ;;
*)
      echo  Please input again
      ;;                                                                                           
esac

解释:通过读取用户输入的数字;如果是1或4 ,提示The price is 20 。因为2号商品和4号商品价格一样,可以写在一起。case支持glob风格。当不满足以上三个case时,用*)表示出以上情况,其他的输入都提示 Please input again

执行结果:

    wKiom1m-EvHDMKOfAAAq6IDImBs206.png

三、for

    1、语法

    for 变量名 in 列表;do

    循环体

    done


        列表生成方式:

        (1)   直接给出列表

            例子3:打印1,2,3

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# ---------------------------------------------------------------
# Filename:     a.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description: echo 1,2,3
# -------------------------------------------------------------
for  line  in  1 2 3; do                                                                    
      echo  $line
done

   解释:line是变量名,可以换成其他名 

         执行结果:

    wKioL1m-FCOQBZafAAAJxKa7Nss093.png

        (2) 整数列表:

            (a) {start..end}

              例子4:计算1+2+3+...+100                    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# ---------------------------------------------------------------
# Filename:     aa.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:1+2+3+...+100                              
# -------------------------------------------------------------
sum =0
for  in  {1..100}; do
         let  sum = sum +i
done
echo  $ sum

    解释:let 使用于变量的运算

            执行结果:

                wKiom1m-FZbzVQYtAAAJ0oOTbec708.png 

      (b) $(seq [start[step]] end)

             例子5:计算1+2+3+...+100                

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# ---------------------------------------------------------------
# Filename:     bb.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:
# -------------------------------------------------------------
sum =0
for  in  ` seq  1 100`; do                                                                           
         let  sum = sum +i
done
echo  $ sum

        解释:seq 1 100 显示出1-100个数,$(command)或者`command` 引用命令执行的结果。$(seq 1 100)将命令执行的结果作为列表

         执行结果:

            wKiom1m-Fm7g_FLFAAAKCPzqVPE613.png

      (3) 返回列表的命令

    $(COMMAND)

        (2)中的seq也是命令的引用

(4) 使用glob 如: *.sh

            例子6:依次显示出/var/log/下所有以.log 结尾文件的行数            

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# ---------------------------------------------------------------
# Filename:     cc.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:/var/log/*.log
# -------------------------------------------------------------
for  file  in  /var/log/ *.log; do
         wc  -l $ file                                  
done

执行结果:

    wKiom1m-GGHhjp2lAABK7-pJHlk063.png

    (5) 变量引用;

    $@, $*   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# ---------------------------------------------------------------
# Filename:     dd.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:1+2+3+..+n
# -------------------------------------------------------------
sum =0
for  in  ` seq  1 $1`; do                                                                            
         let  sum = sum +i
done
echo  $ sum

    解释:引用用户输入参数作为列表,$1表示用户输入的第一个参数。更加的灵活,注意:这里不能使用{1..$1},{}引用变量显示不出来,可以用`seq 1 $1`。

    执行结果:

        wKioL1m-GaOQpyhfAAAaLF8Pqk4714.png

    

四、while

    1、语法

           while CONDITION; do

        循环体

      done

    CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环

    例子1

            

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# ---------------------------------------------------------------
# Filename:     ee.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:
# -------------------------------------------------------------
while  true ; do
           echo  "hello"
done


解释:true 一直为真,所以会一直执行循环体,所以这是个死循环。而且执行后,最好立即按ctrl+c停下,这是个死循环,不会自己停下,最终会造成系统资源耗尽而四级

执行结果:由于执行速度太快,我迅速按下ctrl+c后已经向上翻不到执行脚本的命令了,执行脚本命令./dd.sh

    wKiom1m-GyyQ-A-6AAAIaT8lTPU078.png

例子2:计算1+2+3+…+100       

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
# ---------------------------------------------------------------
# Filename:     ff.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:
# -------------------------------------------------------------
i=1
sum =0                                                                                             
while  [ $i - le  100 ]; do
         let  sum = sum +i
         let  i++
done
echo  $ sum

解释:当i小于或等于100时,执行下面操作。

执行结果:

    wKiom1m-HHWDTiyXAAAJq7jzScc482.png

五、until

    1、语法

      until CONDITION; do

        循环体

      done

    进入条件: CONDITION false

    退出条件: CONDITION true

    例子:当发现系统中有用户名为hacker ,立即让该用户退出登录           

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
# ---------------------------------------------------------------
# Filename:     login.sh
# Revision:     1.0
# Date:         2017-09-13
# Author:       gm
# Website:
# Description:  test user login
# -------------------------------------------------------------
until  who | grep  -q  "^hacker\>" ; do                                                                  
         sleep  1
done
pkill -9 -u hacker

    解释:who|grep -q "^hacker\>" 查找用户名为hacker,当没有找到时,一直循环,休眠1秒,sleep 1,一旦发现hacker用户。直接让用户退出登录,脚本执行完立即退出

    执行结果:当登录上hacker用户后,

    

    wKioL1m-HsfyQMuiAAAIAu1SVXg855.png

    执行该脚本,立即执行完

    wKiom1m-HvbjctU_AAAMFmoJeLk828.png

    再次查看hacker登录,已经被踢出登录

    wKioL1m-HsfxXgvWAAAFmTQt4BY843.png

六、综合应用

        1、对于上面例子中的menu,用户只能输入一次就退出,这里通过多种语法相结合,实现用户多次输入(while 与case结合)

        

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
# ------------------------------------------
# Filename:menu.sh
# Revision: 1.0
# Date: 2017-9-11
# Description: caidan
# ------------------------------------------
echo  "menu
1.yangroutang  
2.mifan        
3.hulatang     
4.jiaozi       
5.lamian       
6.huimian 
"     
 
while  read  -p  "plaese input your food  number(quit is exit): "  num; do
         case  $num  in
         1|4)
                 echo  The price is 20
 
                 ;;
         2|5)
                 echo  The price is 12
                 ;;
         3|6) 
                 echo  The price is 10
                 ;;
         quit) 
                 exit
                 ;;
 
         *)
                 echo  Please input again
                 ;;
         esac
done


 执行结果:

            wKiom1m-IpuQo1okAABRCDbY3Zw905.png

2、打印棋盘(for 和case 结合)

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
# ------------------------------------------
# Filename:xiangqi.sh 
# Revision: 1.0
# Date: 2017-9-11
# Description: 
# ------------------------------------------
huang=` echo  -e  "\033[1;43m      \033[0m" `
lan=` echo  -e  "\033[1;44m      \033[0m" `
hong=` echo  -e  "\033[1;41m      \033[0m" `
for  in  {1..24}; do
         num=` echo  $[($i-1) /3 ]`
         mo=$[num%2]
         case   $mo  in
         0)                                                                                                      
                 for   in  {1..4}; do
                          echo  -n   "$huang$lan"
                 done
                 echo
                 ;;
         *)
                 for   in  {1..4}; do
                          echo  -n   "$lan$huang"
                 done
                 echo
                 ;;
         esac   
   
done
unset  huang lan hong num

    执行结果:

    wKioL1m-JHDCYaUuAABJ9S2ShWM233.png

 

 

 

本文转自 hawapple 51CTO博客,原文链接:http://blog.51cto.com/guanm/1966049



相关文章
|
4月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
149 1
|
3月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
101 2
6种方法打造出色的Shell脚本
|
3月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
121 1
|
3月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
117 2
|
4月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
83 6
|
3月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
4月前
|
Java Shell 网络安全
Shell 流程控制
10月更文挑战第4天
50 2
|
4月前
|
Shell
Shell编程(下)
Shell编程(下)
123 1
|
4月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
65 1
|
4月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
61 0