.shell 程序流程控制结构三大结构
1)顺序结构
2)选择结构
3)循环结构
一、顺序结构的定义
顺序结构的程序设计是最简单的一种结构,它的执行顺序是自上而下,依次执行。
顺序结果的编写流程以及注意事项
1.顺序结构程序编写流程
1)编辑脚本文件,以#!/bin/sh 开头;
#!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是此解释此脚本的shell的路径。其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本。
2)编写业务程序,顺序编写语句块1、语句块2、语句块3 。
2.掌握常见的系统变量的含义:
这些系统变量通常用与命令行参数的获取。
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
$0 | 当前脚本的文件名 |
注意:有时候需要获取到参数的个数,以及所有参数的内容。
变量名 | 说明 | 变量名 | 说明 |
HOME | 当前用户主目录 | PWD | 用户的当前目录 |
PATH | 命令搜索路径 | UID | 当前用户标识符 |
LOGNAME | 用户登录名 | TERM | 终端的类型 |
PS1 | 第一命令提示符,是#或$ | SHELL | 用户的shell类型以及路径 |
PS2 | 第二命令提示符,默认是> | HISFILE | 存储历史命令的文件 |
交互式输入与输出程序编写
1.交互式输入与输出
read 命令读取标准输入设备的一行,到新行换行符前的字符作为终止,把读到的字符赋值给变量。
可以结合echo 一起实现读取并输出的功能。
2.顺序结构交互式输入与输出程序演练
给出输入提示的read用法
read -p “提示信息:” myaddr
选择结构
选择结构的定义
1.选择结构的定义
选择结构是程序中带有判断的一种逻辑结构,只有符合一定的条件,程序体才会被执行。
2.Linux shell 选择结构分类
1)if-then控制结构
2)case–esac控制结构
if
if 语句语法格式:
if [ ] then command1 command2 ... commandN fi
if else
if else 语法格式:
if condition then command1 command2 ... commandN else command fi
if else-if else
if else-if else 语法格式:
if condition1 then command1 elif condition2 then command2 else commandN fi
a=10 b=20 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi
输出结果:
a 小于 b
if else语句经常与test命令结合使用,如下所示:
num1=$[2*3] num2=$[1+5] if test $[num1] -eq $[num2] then echo '两个数字相等!' else echo '两个数字不相等!' fi
输出结果:
两个数字相等!
for 循环
与其他编程语言类似,Shell支持for循环。
for循环一般格式为:
for i in $(seq 1 10) do echo $i done
for io in A B C D E F H K O do echo $io done
for ((m=1; $m<=12; m++ )) do echo $m done
case esac控制结构
case语句适用于需要进行多重分支的应用情况,它也是选择结构中常用的一种控制结构。
case分支语句的格式如下:
case$变量名
in# 严格掌握其语法
模式
1)
# 右括号不能省(”可比较相等”)
命令序列
1
;;
# 两分号不能省
模式
2)
命令序列
2
;;
*)
默认执行的命令序列
;;
esac
#结尾反写case表示结束。
#!/bin/bash read -p "请输入数字(1-7):" a case $a in 1) echo "今天是星期一" ;; 2) echo "今天是星期二" ;; 3) echo "今天是星期三" ;; 4) echo "今天是星期四" ;; 5) echo "今天是星期五" ;; 6) echo "今天是星期六" ;; 7) echo "今天是星期日,休息日!" ;; *) echo "请按规范输入指定数字" ;; esac
输出结果
[root@localhost ~]# ./stt.sh 请输入数字(1-7):4 今天是星期四 [root@localhost ~]# ./stt.sh 请输入数字(1-7):8 请按规范输入指定数字 [root@localhost ~]# ./stt.sh 请输入数字(1-7):1 今天是星期一 [root@localhost ~]# ./stt.sh 请输入数字(1-7):3 今天是星期三
While循环结构
rt=1 while [ $rt -le 10 ] do echo "the script is running..." let rt++ sleep 3 done
i=1 while ((i<=10)) do echo $i let "i++" done
while read 循环使用
1.while read 变量 可以按行读入
一直到所有行都读完,才退出循环,在实际工作中,会经常采用这种循环结构,进行数据的处理。
语法格式:
cat file.txt |while read line
# line可以换个名字,此处的cat也可以是一个产生若干行的命令,如 find
do
….
done
需要注意的是while read line循环体中的变量,退出当前循环后,会被销毁,所以若要二次使用循环体中的变量,则需要采用其他办法。
因为管道后的while loop是sub shell ,所以里面的变量在执行完成后,需要销毁。
cat aa.txt | while read isop do echo $isop done
continue 、break 使用
1.循环中有两种类型的控制break和continue
这是一种无条件的流程控制,强制程序跳出当前的循环,或跳出当前循环继续执行下一个循环。
break命令,会退出当前的循环并且将控制权传递到本循环后面的第一个命令。
continue命令,当在程序执行过程中遇到这个命令,就会忽略本次循环中剩余的命令,将控制权交给循环的顶部。