流程控制语句之—条件执行:条件执行即为满足一种条件就去执行下一步,不满足就跳过该步不执行。条件判断主要是if型和case型。先来看下if型:
if格式:if CONDITION; then CMD ...; fi这是单分支的if语句,即条件满足就执行if中的语句,否则跳过。我们来个例子看一下:
分析一下:for 循环{1..9}。我们用一个单分支语句来条件判断,-le是一个整数测试条件,表示小于等于。我们这里是小于等于5的求和自然是15。对于条件执行语句的条件条件可分三类:(1) 整数测试;(2) 字符串测试;(3) 文件测试
1.整数测试:
整数测试:A, B
A -eq B: 等于
A -ne B: 不等于
A -ge B: 大于等于
A -gt B: 大于
A -le B: 小于等于
A -le B: 不等于
比如想表示条件A < B ,可以写成 if [ $A -lt $B ];then
2.字符测试条件:
符串测试:A, B
A > B
A < B
A >= B
A <= B
A == B或A = B:等值比较
A != B: 不等于
-z A: 判断A是否为空;空则为真,不空则假;
-n A:判断A是否不空;不空则为值,空则为假;
例如:我们判断一段未知字符是否为know ;可以表示为if [ "$A" == "keow" ];then
注意:在字符判断是=号与字符之间保留一个空格,避免报错。
以上是单分支的if语句当我们想表示如果不是A,就B的情况是。单分支语句此时就没办法很好的实现了,因此我们还有双分支以及多分支if语句。if CONDITION-TRUE; then CMD1 ;else CMD2 ;fi 。如果多分支格式为:
if TRUE; then
分支1
elif CONDITION2-TRUE; then
分支2
elif CONDITION3-TRUE; then
分支3
...
else
分支n
fi
注意:这里else也可以没有,为了保持格式的统一建议保留。下面给个例子来熟悉下这个单分支和多分支用法。例如:我们要实现以下功能,给脚本传递一个用户名,如果用户存在则判断其id 是否小于500,如果小于500输出,该用户为系统用户。如果id 大于500,输出用户为普通用户。如果给的用户名不存在,我们给予添加该用户。对于这种题目我们可以先用自己的语言分析一下,先把框架理清楚再下手。
注意:这里使用了脚本传递参数,就涉及的到特殊变量了。那再来找找脚本中船用的特殊变量有那些。$*表示传递参数的列表,比如外面给了三个参数a,b,c 那么$*就表示{a b c}三个参数的集合。他可以直接用在循环中作为LIST,通常用于定义我们不知道的传递参数列表。$# 表示传递参数的个数,比如给脚本传递10个参数,$#就为10。$1...$n用于表示传递的第几个参数。例如$1表示传递的第一个参数。
其实对于这种多分支的if语句,还可以有另外一种简洁方式case语句。case的语法结构:他表示是如果变量引用属于那个pattern,就相应的执行那一个分支。
case 变量引用 in
PATTERN1)
分支1
;;
PATTERN2)
分支2
;;
...
*)
分支n
;;
esac
下面我们就用case来实现以下功能。例如:我们使用tar工具把/etc目录备份至/backup目录中,名字为/backup/etc-日期时间.tar.{xz|bz2|gz};
(1) 显示如下菜单
#######################################
# xz) xz compress tool #
# gzip) gzip compress tool #
# bzip2) bzip2 compress tool #
# *) wrong choice and quit #
#######################################
for型循环格式:for VAR in LIST ; do STATEMENT1 ...; done。VAR是一个变量,表示LIST中的每一个。LIST是一个列表,LIST的个数决定循环的次数。do ...done 分表用来表示循环体的开始和结束。do ...done之间的部分表示循环体,就是每次循环都会执行的部分。我们来一简单的for循环语句来看一下具体的用法比如:我们给系统添加10个用户分别为:student1...student10.
分析:i变量代表1..10中的每一个数,LIST这里是用花括号{first..last}表示。中间两个点点不可丢掉呀。do表示满足条件开始进入循环,done是循环体的结束位置。那么我们这里来说一下循环的LIST列表的几种生成形式:
1.{first..last} 花括号这种表达方式。
2.seq first step last。这里seq是命令这里使用时要命令引用如:`seq 1 2 100` 这就表示,从1到一百中的奇数部分。
3.globbing通配的方式 例如: for i in /etc/* 表示/etc目录下的所有子文件
4.变量引用的方式:$* ,$# 等
5.直接列出——这是一种最简单粗暴的方式,但是仅限于极少参数的情况。
注意:for 循环如果省略会自动生成列表,但是不提倡这种做法。
for循环的嵌套:有时在循环时我们为了让问题简单的实现,需要使用使用双重或者多重循环。这样就必然会用到循环的嵌套。嵌套其实就是外循环循环一次,内循环循环一个周期的方式。比如我们来实现一个9*9乘法表看下效果。