概述
之前介绍了一些bash脚本编程的变量、运算、条件测试的一些基础内容,了解了脚本实际上就是一些语句加上一些流程控制组合起来,实现某种功能的可执行文件。我们知道,条件测试的目的,实际就是为了实现一种流程的控制,那么本篇就简单介绍一下bash里面常见的流程控制语句,包括选择、循环等内容,具体包括以下几个部分:
1、选择控制之if语句
2、选择控制之case语句
3、循环控制之for语句
4、循环控制之while语句
5、循环控制之until语句
6、break和continue的介绍
7、流程控制语句示例脚本
第一章 选择控制之if语句
1、单分支if语句格式
if 判断条件: then
条件为真的分支代码
fi
2、双分支if语句格式
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
3、多分支if语句格式
if 判断条件1; then
条件1为真的分支代码
elif 判断条件2; then
条件2为真的分支代码
elif 判断条件3; then
条件3为真的分支代码
…
else
所有条件都不满足执行的语句
fi
逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
第二章 选择控制之case语句
当用if来进行判断时,如果条件中的值不是某一些连续的取值范围,这时,如果依然用if来进行条件的过滤,代码量将会大大增加。这时针对这些离散,没有规律的取值对象进行选择执行时,就需要用到case语句了。
case语句的语法格式为:
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
…
*)
默认分支
;;
esac
其中PAT为变量的取值,支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或b
第三章 循环控制之for语句
1、for的语法格式一
for 变量名 in 列表;do
循环体
done
此种模式下for的执行机制:
依次将列表中的元素赋值给“变量名”,每次赋值后即执行一次循环体,直到列表中的元素耗尽,循环结束
for中列表的生成方式:
<1> 直接给出列表
<2> 整数列表:
{start..end}
`seq [start [step]] end`
<3> 返回列表的命令 $(COMMAND)
<4> 使用glob, 如: *.sh
<5> 变量引用;$@, $
2、for的语法格式二
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
例如:
for ((i=1;i<=10;i++))
do
echo "nihao"
done
第四章 循环控制之while语句
1、while的常规格式
while CONDITION; do
循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为 true,则执行一次循环;直到条件测试状态为false终止循环。因此:CONDITION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
进入条件: CONDITION为true
退出条件: CONDITION为false
2、无限循环:
while true; do
循环体
done
3、while循环的特殊用法(遍历文件的每一行):
while read line; do
循环体
done < /PATH/FROM/SOMEFILE
依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line
第五章 循环控制之until语句
1、常规until循环格式
until CONDITION; do
循环体
done
进入条件: CONDITION 为false
退出条件: CONDITION 为true
2、创建无限循环
until false; do
循环体
done
第六章 break和continue介绍
1、continue语句,用于循环体中
continue [N] 提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
while CONDTIITON1; do
CMD1
…
if CONDITION2; then
continue
fi
CMDn
…
done
2、break语句
break [N] 提前结束第N层循环, 最内层为第1层
while CONDTIITON1; do
CMD1
…
if CONDITION2; then
break
fi
CMDn
…
done
第七章 流程控制语句示例脚本
1、写个脚本:实现打印正边三角形
#!/bin/bash # Autor: nwc # Version: 2.0 # CreateTime: 2016-08-17 # Description:利用循环语句,实现打印三角形 # * # *** # ***** # ******* #********* read -p "please input the lines: " Line echo "================A PROJECT==============" if expr $Line + 0 &>/dev/null && [ `expr $Line + 0` -gt 0 ];then for((i=1;i<=$Line;i++)){ for((S=$Line;S>i;S--)){ echo -n " " } for LS in `seq 1 $i`;do echo -ne "\033[31m*\033[0m" done for((RS=1;RS<i;RS++)){ echo -ne "\033[31m*\033[0m" } echo } else echo "wrong args" fi echo "================B PROJECT==============" if expr $Line + 0 &>/dev/null && [ `expr $Line + 0` -gt 0 ];then for((j=1;j<=$Line;j++)){ sp=$[${Line}-$j] st=$[$j*2-1] for((k=1;k<=$sp;k++)){ echo -n " " } for((m=1;m<=$st;m++)){ echo -ne "\033[31m*\033[0m" } echo } else echo "wrong args" fi unset Line unset i unset S unset LS unset RS unset j unset sp unset st unset k unset m
执行结果如下:
2、用until循环实现国际象棋棋盘
#!/bin/bash # Autor: nwc # Version: 2.0 # CreateTime: 2016-08-18 # Description:用unilt打印国际象棋棋盘 read -p "please input the lines: " line read -p "please input the rows: " row if [ $line -ge 1 ] &>/dev/null && [ $row -ge 1 ] &>/dev/null ;then l=1 r=1 #l和r分别代表初始行坐标和初始列坐标 w="\033[47m \033[0m" b="\033[40m \033[0m" until [ $l -gt $line ];do until [ $r -gt $row ];do m=$[($l+$r)%2] [ $m -eq 0 ] && echo -ne "$w" || echo -ne "$b" let r++ done echo let l++ r=1 done else echo "bad lines or rows" fi unset line unset row unset l unset r unset w unset b
执行效果为:
原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/36985