天天看点

shell脚本编程——流程控制shell脚本编程——流程控制 一、if   1、语法     解释:如果输入的数中匹配到了数字以外的字符,则提示不是自然数,其他情况,则提示是自然数。 二、case三、for四、while五、until六、综合应用

目   录

一、 if 

二、 case

三、 for

四、 while

五、 until

六、 综合应用

            (1)单分支

            if  判断条件;then

            fi

            (2)双分支

            if 判断条件; then

                条件为真的分支代码

            else

                条件为假的分支代码

            (3)多分支

            if 判断条件1; then

            elif 判断条件2; then

             elif 判断条件3; then

             else

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

             fi

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

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

<code>#!/bin/bash</code>

<code># ---------------------------------------------------------------</code>

<code># Filename:checkint.sh</code>

<code># Revision:     1.0</code>

<code># Date:         2017-09-12</code>

<code># Author:       gm</code>

<code># Website:</code>

<code># Description:check int</code>

<code># -------------------------------------------------------------</code>

<code>read</code> <code>-p </code><code>"please input number: "</code> <code>num</code>

<code>if</code> <code>[[ </code><code>"$num"</code> <code>=~ [^[:digit:]] ]];</code><code>then</code>

<code>        </code><code>echo</code> <code>"The number is not a int"</code>

<code>else</code>

<code>        </code><code>echo</code> <code>"The number is  a int"</code>

<code>fi</code>

        执行结果:

    1、语法

    case 变量引用 in

    PAT1)

    分支1

    ;;

    PAT2)

    分支2

    ...

    *)

    默认分支

    esac

        case支持glob风格的通配符:

        *: 任意长度任意字符

        ?: 任意单个字符

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

        a|b: a或b

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

<code># ------------------------------------------</code>

<code># Filename:   menu.sh</code>

<code># Revision:   1.0</code>

<code># Date:       2017-9-11</code>

<code># Description: cai dan</code>

<code>echo</code> <code>"menu</code>

<code>1.tang  </code>

<code>2.rice  </code>

<code>3.fruit  </code>

<code>4.jiaozi       </code>

<code>5.lamian       </code>

<code>6.huimian </code>

<code>"     </code>

<code>read</code> <code>-p </code><code>"plaese input your food  number: "</code> <code>num</code>

<code>case</code> <code>$num </code><code>in</code>

<code>1|4)</code>

<code>     </code><code>echo</code> <code>The price is 20</code>

<code>     </code><code>;;</code>

<code>2|5)</code>

<code>     </code><code>echo</code> <code>The price is 12</code>

<code>3|6) </code>

<code>     </code><code>echo</code> <code>The price is 10</code>

<code>*)</code>

<code>     </code><code>echo</code> <code>Please input again</code>

<code>     </code><code>;;                                                                                           </code>

<code>esac</code>

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

执行结果:

    for 变量名 in 列表;do

    循环体

    done

        列表生成方式:

        (1)   直接给出列表

            例子3:打印1,2,3

<code># Filename:     a.sh</code>

<code># Date:         2017-09-17</code>

<code># Description: echo 1,2,3</code>

<code>for</code> <code>line </code><code>in</code> <code>1 2 3;</code><code>do</code>                                                                    

<code>     </code><code>echo</code> <code>$line</code>

<code>done</code>

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

         执行结果:

        (2) 整数列表:

            (a) {start..end}

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

<code># Filename:     aa.sh</code>

<code># Description:1+2+3+...+100                              </code>

<code>sum</code><code>=0</code>

<code>for</code> <code>i </code><code>in</code> <code>{1..100};</code><code>do</code>

<code>        </code><code>let</code> <code>sum</code><code>=</code><code>sum</code><code>+i</code>

<code>echo</code> <code>$</code><code>sum</code>

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

            执行结果:

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

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

<code># Filename:     bb.sh</code>

<code># Description:</code>

<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>1 100`;</code><code>do</code>                                                                           

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

      (3) 返回列表的命令

    $(COMMAND)

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

(4) 使用glob, 如: *.sh

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

<code># Filename:     cc.sh</code>

<code># Description:/var/log/*.log</code>

<code>for</code> <code>file</code> <code>in</code> <code>/var/log/</code><code>*.log;</code><code>do</code>

<code>        </code><code>wc</code> <code>-l $</code><code>file</code>                                  

    (5) 变量引用;

    $@, $*   

<code># Filename:     dd.sh</code>

<code># Description:1+2+3+..+n</code>

<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>1 $1`;</code><code>do</code>                                                                            

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

    执行结果:

           while CONDITION; do

        循环体

      done

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

    例子1:

<code># Filename:     ee.sh</code>

<code>while</code> <code>true</code><code>;</code><code>do</code>

<code>          </code><code>echo</code> <code>"hello"</code>

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

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

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

<code># Filename:     ff.sh</code>

<code>i=1</code>

<code>sum</code><code>=0                                                                                             </code>

<code>while</code> <code>[ $i -</code><code>le</code> <code>100 ];</code><code>do</code>

<code>        </code><code>let</code> <code>i++</code>

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

      until CONDITION; do

    进入条件: CONDITION 为false

    退出条件: CONDITION 为true

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

<code># Filename:     login.sh</code>

<code># Date:         2017-09-13</code>

<code># Description:  test user login</code>

<code>until</code> <code>who</code><code>|</code><code>grep</code> <code>-q </code><code>"^hacker\&gt;"</code><code>;</code><code>do</code>                                                                  

<code>        </code><code>sleep</code> <code>1</code>

<code>pkill -9 -u hacker</code>

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

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

    执行该脚本,立即执行完

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

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

<code># Filename:menu.sh</code>

<code># Revision: 1.0</code>

<code># Date: 2017-9-11</code>

<code># Description: caidan</code>

<code>1.yangroutang  </code>

<code>2.mifan        </code>

<code>3.hulatang     </code>

<code>while</code> <code>read</code> <code>-p </code><code>"plaese input your food  number(quit is exit): "</code> <code>num;</code><code>do</code>

<code>        </code><code>case</code> <code>$num </code><code>in</code>

<code>        </code><code>1|4)</code>

<code>                </code><code>echo</code> <code>The price is 20</code>

<code>                </code><code>;;</code>

<code>        </code><code>2|5)</code>

<code>                </code><code>echo</code> <code>The price is 12</code>

<code>        </code><code>3|6) </code>

<code>                </code><code>echo</code> <code>The price is 10</code>

<code>        </code><code>quit) </code>

<code>                </code><code>exit</code>

<code>        </code><code>*)</code>

<code>                </code><code>echo</code> <code>Please input again</code>

<code>        </code><code>esac</code>

 执行结果:

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

<code># Filename:xiangqi.sh </code>

<code># Description: </code>

<code>huang=`</code><code>echo</code> <code>-e </code><code>"\033[1;43m      \033[0m"</code><code>`</code>

<code>lan=`</code><code>echo</code> <code>-e </code><code>"\033[1;44m      \033[0m"</code><code>`</code>

<code>hong=`</code><code>echo</code> <code>-e </code><code>"\033[1;41m      \033[0m"</code><code>`</code>

<code>for</code> <code>i </code><code>in</code> <code>{1..24};</code><code>do</code>

<code>        </code><code>num=`</code><code>echo</code> <code>$[($i-1)</code><code>/3</code><code>]`</code>

<code>        </code><code>mo=$[num%2]</code>

<code>        </code><code>case</code>  <code>$mo </code><code>in</code>

<code>        </code><code>0)                                                                                                      </code>

<code>                </code><code>for</code>  <code>j </code><code>in</code> <code>{1..4};</code><code>do</code>

<code>                         </code><code>echo</code> <code>-n  </code><code>"$huang$lan"</code>

<code>                </code><code>done</code>

<code>                </code><code>echo</code>

<code>                         </code><code>echo</code> <code>-n  </code><code>"$lan$huang"</code>

<code>        </code><code>esac</code>   

<code>  </code> 

<code>unset</code> <code>huang lan hong num</code>

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