Linux shell脚本 流程控制

shell脚本的流程分为三种,顺序执行,选择执行和循环执行。顺序执行就是按照脚本中语句的顺序依次执行各条语句,每个回车和“;”都表明了下一条命令,而选择执行是经过选择语句来对命令进行有选择的定向执行,循环执行是在特定的条件下重复执行命令。这三种执行流程在使用时能够灵活的套嵌,来知足咱们的需求shell

一.顺序执行

顺序执行是一个大的框架,脚本里的全部命令均可以看作是在顺序执行中嵌套其余的流程centos

例如bash

#!/bin/bash

sum=0

while [ $# -gt 0 ];do

        sum=$[$(cat $1 | wc -l) + $sum]

        shift

done

echo $sum

 

上面的代码执行顺序是框架

  1. sum=0
  2. while到倒数第二行的done
  3. echo $sum

其中上面的第二部分while是循环执行的语句,从while到done能够看作一个总体。这就是一个顺序嵌套循环,在while语句看作一个总体的前提下,命令按照从上到下的顺序依次执行也就是顺序执行。测试

 

二.选择执行(if/case)

1.ifcentos7

if是选择执行语句的一种,其格式为:spa

 

1 if 判断条件 ;thencode

2 判断条件为真时要执行的命令blog

3 elif 判断条件 ;then字符串

4 判断条件为真时要执行的命令

5 else

6 当以上全部判断都为假时要执行的命令

7 fi

 

解释:

第一行的“if”告诉计算机,个人if语句开始了,“判断条件”告诉计算机什么状况下要执行下面的命令,“;”告诉计算机个人判断条件结束了,“then”告诉计算机接下来该执行命令了,“;then”也能够理解为固定格式。

第二行就是第一行告诉计算机要执行的命令

第三行的“elif”就是else if的意思,意思是若是第一行“if”的判断为假,则继续判断以后“elif”的判断条件

第四行是“elif”判断为真时要执行的命令

第五行的意思是当上面全部的判断都为假的时候则执行下面的命令

第六行要写全部的判断都为假的时候执行的命令

第七行告诉计算机我要结束个人if语句了

 

if语句的格式中第三四行能够根据需求写无数次,第一二七行必须写并且只能写一次,第五六行最多有一次不过能够不写,当if语句中有多个elif时,计算机会逐条对判断条件金星判断,并执行第一次为真的判断条件的命令,若是都为假,有else则执行else后的命令,五else则直接跳出if语句

例如

#!/bin/bash

a=$1

if [ $a -eq 1 ];then

        echo h

elif [ $a -eq 2 ];then

        echo i

elif [ $a -eq 3 ];then

        echo j

elif [ $a -eq 4 ];then

        echo k

else

        echo F

fi

 

解释:

在这个脚本中我把a赋值为输入的第一个参数,并依此进行判断,若是a和1相等则输出h,若是a和2相等则输出i,若是a和3相等则输出j,若是a和4相等则输出k,若是a和1,2,3,4,都不相等则输出F

 

 2.case

case是另外一中选择执行语句,其格式为:

  1. case 变量 in
  2. 判断值) 执行的命令;;

       3. 判断值) 执行的命令;;

       4. *)执行的命令;;

       5. esac

 

解释:

第一行的case告诉计算机个人case语句开始了“变量”是咱们要判断的数据能够是数数值也能够是字符串等等,“in”能够理解为固定格式

第二行的判断值是咱们判断的依据,“)”是固定格式,告诉计算机个人判断值结束了,后面是这个判断值对应的命令“;;”告诉计算机个人执行命令到此结束,这整个一行的意思是,若是第一行的变量和个人判断值相等则执行后面的命令

第三行同第二行

第四行*表明全部的值,因为case语句是按顺序依次判断的,因此写在最后的*)意思就是上面的判断值和变量都不相等时执行以后的命令

第五行告诉计算机个人case语句结束了

 

case是按照从上至下的顺序依次判断,可根据需求将“判断值) 执行的命令;;”写任意条,而判断则会遍历这些直到遇到变量和判断值相等,执行命令并退出case,“*)执行的命令”可根据须要不写,效果是若是上面的判断值和变量都不相等则什么都不执行直接退出case

 

举例:

#!/bin/bash

case $1 in

        man)echo "男人";;

        woman)echo "女人";;

        [1-9])echo "数字";;

        [[:alpha:]])echo "字母";;

        *)echo "fault";;

esac

 

解释:

这个脚本中我把输入的第一个参数看成变量,并依次和下面的判断值做比较,当输入值为man时输出“男人”当输入值为woman时输出为“女人”当输入为数字时输出为“数字”,当输入为字母时输出为“字母”,当输入不是上面的这些状况时输出为“fault”

三.循环执行(for/while)

1.for

for循环格式:

1.for 变量 in 列表 ;do

2. 循环体

3. done

运行机制:

依次将列表中的元素赋值给变量,每赋值一次执行一次循环体,直到列表的元素用尽,循环结束

解释:

第一行的“for”告诉计算机个人for循环语句开始了,“变量”是设置的一个参数用于循环,也能够在循环体中使用,“in 列表”告诉计算机我要用于循环的元素列表,“do”告诉计算机接下来是循环体也就是要执行的命令

第二行的“循环体”也就是咱们要执行的命令

第三行的“done”告诉计算机循环体结束,进行下一次循环,若是没有元素了则退出for循环

for循环中列表的书写方式:

(1) 直接给出列表 a b c

(2) 整数列表:

(a) {start..end} {1..10}

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

(3) 返回列表的命令

$(COMMAND)

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

(5) 变量引用;

$@, $*

举例:

#!/bin/bash

for n in $(seq 10);do

        echo $n

done

 

解释:

这个脚本效果是输出1到10,每一次循环,都会按顺序从列表“$(seq 10)”中读取一个值赋给n,并执行echo命令,因此在每一次循环中n的值都不同,因此每次输出的值也就不同。

 另外for循环也能够写成c语言的形式,其格式为:

for ((i=0;i<b;i++));do

循环体

done

其中i是咱们的循环变量,i=0是把i的初始值设为0,i<b,b是咱们设置的一个数值,用来告诉循环何时中止,i++的意思是每次循环i自加1

2.while

while循环格式

  1. while CONDITION  ;do
  2. 循环体
  3. done

运行机制:

CONDITION:循环控制条件;进入循环以前,先作一次判断;每一次循环以后会再次作判断;条件

“true”,则执行一次循环;直到条件测试状态为“false”终止循环

所以CONDTION通常应该有循环控制变量;而此变量的值会在循环体不断地被修正

解释:

第一行“while”告诉计算机while循环开始,“CONDITION”是循环控制条件,控制循环,告诉计算机何时结束,“do”开始执行循环体

第二行“循环体”也就是咱们要执行的命令

第三行“done”执行循环体结束并进入下一次循环,若是达到控制条件则退出循环

举例:

 

#!/bin/bash

n=1

while [ $n -le 5 ];do

        echo $n

        let n++

done

 

解释:

这个脚本效果是输出1到5,我先赋值n为1,在while循环中,控制条件是“[ $n -le 5 ]”意思是n小于等于5,因此第一行的意思是当n小于等于5的时候执行下面的循环体,循环体是输出n的值,“let n++”的意思是让n自加1,也就是每循环依次n就会加1,它和控制条件配合来限制循环次数

 

3.循环控制语句(continue/break/shift)

1)continue

continue[N] 用于循环体中意思是结束第N层循环,直接进入下一轮的判断,N默认为1

举例:

 

首先我写了一个两层for循环嵌套的脚本,最外层的会执行五次,每次执行会先输一个序号来告诉咱们这是第几回的输出,而后执行内层的for循环,第二个for循环的做用是输出abc,“echo \ ”的做用是输出一个换行

#!/bin/bash

for n in {1..5};do

        echo -n $n

        for m in a b c;do

                echo -n $m

        done

        echo \

done

 

执行结果

[root@centos7 bin]# . a.sh

1abc

2abc

3abc

4abc

5abc

 

而后咱们加入一个if语句,其执行的命令为continue。加入后在执行内层for循环语句的时候先判断变量m的值是否为b,若是为b则执行continue,跳出本次循环也就不会在执行if语句后的输出语句,跳出本次循环后直接进入下一个内层的for循环

#!/bin/bash

for n in {1..5};do

        echo -n $n

        for m in a b c;do

        if [ $m == b ];then

                continue

        fi

                echo -n $m

        done

        echo \

done

 

执行结果

[root@centos7 bin]# . a.sh

1ac

2ac

3ac

4ac

5ac

 

咱们如今把continue后加一个2,加入后每当变量m的值为b就会跳出两层循环,也就是直接进入外层for的下一个循环,因此输出序号和a后直接进入下一个循环

#!/bin/bash

for n in {1..5};do

        echo -n $n

        for m in a b c;do

        if [ $m == b ];then

                continue 2

        fi

                echo -n $m

        done

        echo \

done

 

执行结果

[root@centos7 bin]# . a.sh

1a2a3a4a5a[root@centos7 bin]#

 

2)break

break N 用于循环体中,提早结束第N层循环,最内层为第一层

举例:

仍是上面的例子,咱们把continue换成break,换成break后每当变量m为b时则跳出整个内层的for循环,而后执行外层for循环的“echo \ ”以后进行下一次的外层for循环

#!/bin/bash

for n in {1..5};do

        echo -n $n

        for m in a b c;do

        if [ $m == b ];then

                break

        fi

                echo -n $m

        done

        echo \

done

 

执行结果

[root@centos7 bin]# . a.sh

1a

2a

3a

4a

5a

 

而后咱们在break后加上2,使之直接跳出两层循环,当第一次变量m的值为b时跳出两层for循环也就是直接运行结束

执行结果

[root@centos7 bin]# . a.sh

1a[root@centos7 bin]#

 

3)shift

shift n 将参数列表向左移动n位,前n位已溢出则直接从列表中删除

举例

#!/bin/bash

while [ $# -gt 0 ];do

        echo $*

        shift

done

 

解释:

“$#”是传递给脚本的参数个数,“$*”是传递给脚本的所有参数,当参数个数大于0时输出全部参数并将参数左移

执行结果

[root@centos7 bin]# . a.sh a b c d e

a b c d e

b c d e

c d e

d e

e
相关文章
相关标签/搜索