一、条件测试
1.1 返回码 $?
$? :返回码,用来判断命令或者脚本是否执行成功(最近的一条)。
0 :true,为真就是成功,成立。
非0 :false,失败或者异常。
1.2 test命令
可以进行条件测试,然后根据返回值来判断条件是否成立。
-e :exist,测试目录或者目录是否存在
-d :directory,测试目录是否存在
-f :file,测试普通文件是否存在
-r :read,测试当前用户是否对文件/目录有读权限
-w :write,测试写权限
-x :execution,测试执行权限
1.3 比较符
1.3.1 整数比较符
注意:以下操作符只能用于整数比较
-eq:等于,equal
-ne:不等于,not equal
-gt:大于,greater than
-lt:小于,less than
-ge:大于等于,gt或eq
-le:小于等于,lt或eq
1.3.2 类C语言的整数比较符
注意:以下操作符一般不能用test进行比较
==:等于,既可以比较数字,也可以比较字符串
!=:不等于
>:大于
<:小于
>=:大于等于
<=:小于等于
这种比较符一般用于比较变量或者字符串。
1.3.3 比较符格式
[ ] :注意格式,所有参数和符号都要以空格隔开
[[ ]] :可以使用更高级的模式,可以使用正则表达式。而且,在双中括号中使用字符串的时候可以不加引号,而不用担心引起歧义。
(( )) :只能使用算数比较符
1.3.4 逻辑与和逻辑或
与:&&,或者-a,条件都满足才成立
或:||,或者-o,满足一个条件即成立
注意:-a 和 -o 只能在 [ ]中使用,[[ ]]中或者两个[ ]之间只能用&& ||
二、if语句
2.1 if语句的基本组成
if :后面是条件测试语句
then :后面跟命令序列,只有条件测试语句成立,才会执行then的命令模块
elif:后面也是条件测试语句,用于多分支结构
else:后面跟命令序列,所有的条件测试语句均不满足时,执行else的命令模块
fi :结束语句
2.2 单分支结构
在/opt目录下创建t1.sh
if
条件满足才执行then
2.2 双分支结构
要求:比较两个整数的大小
在/opt
目录下创建t2.sh
if
条件满足执行then
if
条件不满足执行else
2.3 多分支结构
要求:提示输入考试成绩,根据输入内容返回结果:
100分:天才!;85-99分:优秀!;60-84分:合格!;60分以下,不合格!
在/opt目录下创建t3.sh
if条件满足执行then
若if条件不满足,来到第一个elif,条件满足执行then
若第一个elif条件不满足,来到下一个elif,条件满足执行then
若if elif的条件都不满足,执行else下的命令
2.4 嵌套if结构
要求:检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
在/opt目录下创建t4.sh
检验:
说明:嵌套if语句中,下一层if的条件测试是建立在上一层if的条件测试结果的前提下的。注意每一层if都有对应的fi结束语句。
三、case语句
case相当于if多分支结构
格式:
例:要求:用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录,分别使用tar -zxvf和tar -jxvf
t5.sh:用位置变量传参的方式
检验:
.tar.bz2文件也是一样,这里不展示了。
例2:用case实现2.3的例子:要求提示输入考试成绩,根据输入内容返回结果:
100分:天才!;85-99分:优秀!;60-84分:合格!;60分以下,不合格!
四、练习
需求1
通过位置变量传参的方式,给脚本内部传一个ip地址
用if判断主机是否存活,若存活提示用户ip is online,而且要保存到/opt/hosts.txt文件,若主机无连接,提示用户 ip is offline
使用ping -c 5 检测连通性,但不显示ping的过程
test1.sh
第一行的解释:&> /dev/null,将前面ping的输出结果全部重定向到/dev/null,/dev/null 有一个非常有用的特性:它会立即丢弃所有写入它的数据,也被称为“数据黑洞”。这样将ping的结果重定向到/dev/null,就不会在终端上显示。
检验:
需求2
提示用户输入内容,使用if 语句判断输入的内容是否为整数。判断范围0-100。然后再判断输入的内容是奇数还是偶数。
提示:判断输入的内容是否为整数,可以用
-eq是整数比较符,如果变量不是整数,比如小数或者字符串会报错,并跳转到else执行,把报错信息重定向到/dev/null就不会在终端显示多余的信息。
实现:test2.sh
对检验奇数偶数的解释: $(($num%2)),对变量除以2取余数,余数为0则为偶数,余数为1则为奇数。
验证:
需求3
提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,
大于10秒的都淘汰,
如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别。
男生进男生组,女生进女生组,如果输入错误请提示错误(整数判断,小数判断。)
test3.sh:只允许输入整数
检验:
如果要实现小数判断,可以用bc实现,比如:
把两个小数变量比较的结果保存到result中,再用if语句对result进行判断,请自行探索。
需求4
用case语句控制 firewalld start|stop|restart|status 来管理firewalld服务,要求如果命令选项不对,则提示输入不正确:{start|stop|status|restart}
test4.sh:用传参的方式
检验: