shell脚本的流程分为三种,顺序执行,选择执行和循环执行。顺序执行就是按照脚本中语句的顺序依次执行各条语句,每个回车和“;”都表明了下一条命令,而选择执行是经过选择语句来对命令进行有选择的定向执行,循环执行是在特定的条件下重复执行命令。这三种执行流程在使用时能够灵活的套嵌,来知足咱们的需求shell
顺序执行是一个大的框架,脚本里的全部命令均可以看作是在顺序执行中嵌套其余的流程centos
例如bash
#!/bin/bash sum=0 while [ $# -gt 0 ];do sum=$[$(cat $1 | wc -l) + $sum] shift done echo $sum
上面的代码执行顺序是框架
其中上面的第二部分while是循环执行的语句,从while到done能够看作一个总体。这就是一个顺序嵌套循环,在while语句看作一个总体的前提下,命令按照从上到下的顺序依次执行也就是顺序执行。测试
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
case是另外一中选择执行语句,其格式为:
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循环格式:
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
while循环格式
运行机制:
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,它和控制条件配合来限制循环次数
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]#
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]#
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