目录
7.1 条件符号使用双圆括号,可以在条件中植入数学表达式 if (())
一、if 介绍
如何写一个高可用性的脚本,赋予脚本智能化,赋予脚本执行逻辑。
比如nginx安装脚本中
- configure执行成功在执行make,
- make执行成功在执行make install
- 上一步错误就不需要执行后面的代码了。
answer: 加入判断
只要你想在代码中判断一下的时候就第一时间想到if就行了,适用于99%的语言。
当我们在写程序的时候,时常对上一步执行是否成功如何判断苦恼,当我们今天学习了if就可以解决你的苦恼。if语句在我们程序中就是用来做判断的,以后大家不管学习什么语言,以后只要涉及到判断的部分,大家就可以直接拿if来使用,不同的语言之间的if只是语法不同,原理是相同的。
二、单 if 语法
适用范围:只需要一步判断,条件返回真则执行下一步操作。
语句格式
if [ condition ] # condition 值为true or false。[] 两边需要空格
then # 条件为真的时候执行
commands # 代码块。一行或者多行代码
fi # 语句的结束
下面通过一段代码来演示一下吧,判断 当前用户是不是root,如果不是那么返回”ERROR: need to be root so that!”
[root@shell ~]# vim /tmp/if-1.sh
#!/bin/bash
if [ $USER != 'root' ]
then
echo "ERROR: need to be root so that!"
exit 1
fi
[root@shell ~]# chmod 755 /tmp/if-1.sh
[root@shell ~]# sh /tmp/if-1.sh ; echo $?
0
[root@shell ~]# echo $USER
root
# 切换用户
[root@shell ~]# su - harry
上一次登录:二 11月 29 18:22:56 CST 2022pts/0 上
[harry@shell ~]$ sh /tmp/if-1.sh
ERROR: need to be root so that!
[harry@shell ~]$ echo $?
1
[harry@shell ~]$ exit
登出
三、if…else 语句
适用范围:两步判断,条件为真执行操作,条件为假则执行另一个操作。
if [ condition ] # 条件判断
then # 条件为真
commands1 # 真 要执行代码块
else # 条件为假
commands2 # 假 要执行的代码块
fi # 结束
通过一段代码演示一下吧,判断当前登录用户是管理员还是普通用户,如果是管理员输出“hey admin”; 如果是普通用户输出“hey guest”:
[root@shell tmp]# vim if-2.sh
#!/bin/bash
if [ $USER == 'root' ]
then
echo "hey admin"
else
echo "hi guest"
fi
[root@shell tmp]# whoami
root
[root@shell tmp]# sh if-2.sh
hey admin
[root@shell tmp]# su - harry -c "sh /tmp/if-2.sh"
hi guest
四、if…elif…else
适用范围:两个以上的判断结果,也就是多于一个以上的判断条件。
if [ condition 1] 满足第一个条件
then 真
command1 执行 command1 代码块
elif [ condition 2] 满足第二个条件
then 真
commands2 执行 command2 代码块
.......
else 如果条件都不满足
commandsX 执行 commandX 代码块
fi 结束判断
通过一段代码演示一下吧,通过一个脚本,判断两个整数的关系
案例需求
判断内存的使用率
- 60以下 ok
- 60以上 黄色警告
- 70以上 橙色严重警告
- 80以上 红色警告
案例思考
内存使用率获得方式
- 手动给出
- 通过内存查看命令运算得出
案例代码
[root@shell tmp]# vim if-3.sh
#!/bin/bash
#1、条件
#判断内存的使用率
#60以下 ok 绿色 32m
#60以上 黄色警告 33m
#70以上 粉色严重警告 35m
#80以上 红色警告 31m
#2、算法
#收集内存使用率 $1 # 脚本外传参
#
#多条件判断
if [ $1 -gt 80 ]
then
echo -e "\033[31m 警告 \033[0m"
elif [ $1 -gt 70 ]
then
echo -e "\033[35m 警告 \033[0m"
elif [ $1 -gt 60 ]
then
echo -e "\033[33m 警告 \033[0m"
else
echo -e "\033[32m OK \033[0m"
fi
# 注意事项:
如果多条件判断存在包含的关系,需要从最严格开始判断;否则,后面的就不会生效
如果你第一个判断的是60以上,那么 70 80 都符合第一个条件。所以后面的判断70 80 就没有任何意义
效果展示
关于脚本外传参:shell 内置变量
- 本程序的名字: $0
- 本程序执行进程号是:$$
- 上条命令执行结果是:$?
- 传入参数的数量是:$#
- 传入的第2个参数是:$2
- 传入的参数列表:$@
脚本外传参的执行方法:脚本名字 参数1 参数2 …(如上面的脚本执行方式)
脚本内部调用的方法 :$1 $2 … $N
特点:减少用户交互
五、if 嵌套 if
当有多步判断的时候,可以使用if嵌套
- 多步判断。类似于多条件if
- 依赖执行的环境 configure -> make-> make install
5.1 使用 if 嵌套 if 的方式判断两个整数的关系
#!/bin/bash
if [ $1 -eq $2 ];then
echo "$1 = $2"
else
if [ $1 -gt $2 ];then
echo "$1 > $2"
else
echo "$1 < $2"
fi
fi
效果展示
5.2 写一个nginx安装初始化脚本
案例需求
写一个nginx业务初始化脚本,完成nginx软件自动安装。
案例思考
- nginx软件包获得方式
- nginx安装流程
- nginx安装依赖关系
案例步骤
- 软件包下载
- 软件包解压
- 安装依赖包
- 安装nginx
- 返回结果
案例代码
[root@shell tmp]# vim nginx_install.sh
#!/bin/bash
source_pkg=nginx-1.19.2.tar.gz
#1、软件包下载
wget http://nginx.org/download/$source_pkg
#2、解压
if [ -f $source_pkg ];then
tar xf $source_pkg && cd nginx-1.19.2
else
echo "not found $source_pkg"
exit 1
fi
#3、安装依赖包
if ! ( yum -y install pcre-devel zlib-devel );then
echo "yum: install soft error"
exit 1
fi
#4、配置
#判断配置语句执行结果
if ./configure 1>/dev/null
then
#判断make执行结果
if make 1>/dev/null
then
#判断make install安装结果
if make install 1>/dev/null
then
echo "nginx 安装成功"
else
echo "nginx 安装失败"
exit 1
fi
else
echo "make fail"
exit 1
fi
else
echo "configure fail"
exit 1
fi
#./configure 等价于 if [ $? -eq 0 ];then
#注意: 1>/dev/null
1 为标准输出
2 为标准错误输出
六、if 语句与 shell 运算
6.1 与文件存在与否的判断
-e 是否存在 不管是文件还是目录,只要存在,条件就成立
-f 是否为普通文件
-d 是否为目录
-S socket
-p pipe
-c character
-b block
-L 软link
案例演示
# 判断/tmp/test目录,如果没有则创建它
[root@shell tmp]# vim if-5.sh
#!/bin/bash
if [ ! -d /tmp/test ];then
mkdir -pv /tmp/test
fi
[root@shell tmp]# sh if-5.sh
mkdir: 已创建目录 "/tmp/test"
[root@shell tmp]# ls
6.2 文件权限相关的判断
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
-u 是否有suid
-g 是否sgid
-k 是否有t位
案例演示:
[root@shell tmp]# vim if-6.sh
#!/bin/bash
if [ -x /tmp/test/linux ];then
/tmp/test/linux
else
echo "ERROR: no exec"
fi
# 没有文件报错
[root@shell tmp]# sh if-6.sh
ERROR: no exec
[root@shell tmp]# echo "echo hahha" > /tmp/test/linux
# 没有执行权限报错
[root@shell tmp]# sh if-6.sh
ERROR: no exec
[root@shell tmp]# chmod 755 /tmp/test/linux
[root@shell tmp]# sh if-6.sh
hahha
6.3 整数之间的判断
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
浮点比较运算
比较两个浮点数字的大小
给脚本两个浮点数字 返回他两的关系
#思路
1、获得两个浮点数字
2、处理为整形
3、比较
4、输出
# 案例演示:
#!/bin/bash
#1. 交互或者外传参的方式获得两个整数
#$1 $2
[ $# -lt 2 ]&&echo "need two args" && exit 1
#2. 采用外传参的方式接收数据并放大 100倍,并处理为整数
num1=`echo "scale=2;$1*100" | bc | cut -d "." -f1`
num2=`echo "scale=2;$2*100" | bc | cut -d "." -f1`
#3. 比较运算
if [ $num1 -gt $num2 ];then
#3、输出结果
echo "$1 > $2"
elif [ $num1 -lt $num2 ];then
echo "$1 < $2"
else
echo "$1 = $2"
fi
6.4 字符串之间的判断
-z 是否为空字符串 字符串长度为0,就成立
-n 是否为非空字符串 只要字符串非空,就是成立
string1 == string2 是否相等
string1 != string2 不等
案例演示:
[root@shell tmp]# vim if-7.sh
#!/bin/bash
# 交互式输入用户名 密码
read -p "user: " myuser
if [ -z "$myuser" ];then
echo "用户名为空!"
exit 1
fi
# 从外往里写嵌套 if
read -p "password: " mypw
if [ -n "$mypw" ];then
# 判断用户名
if [ $myuser == "root" ];then
# 判断密码
if [ $mypw == "root" ];then
echo "welcome root~"
else
echo "密码错误!"
exit 1
fi
else
echo "用户名错误!"
exit 1
fi
else
echo "密码不能为空!"
exit 1
fi
效果展示:
6.5 多重条件判断
# 逻辑判断符号:
&& (and 逻辑与) 两个条件同时满足,整个大条件为真
|| (or 逻辑或) 两个条件满足任意一个,整个大条件为真
! 非运算
案例演示:
[root@shell tmp]# vim if-8.sh
#!/bin/bash
# 交互式输入用户名 密码
read -p "user: " myuser
if [ -z "$myuser" ];then
echo "用户名为空!"
exit 1
fi
# 从外往里写嵌套 if
read -p "password: " mypw
if [ -n "$mypw" ];then
if [ $myuser == 'root' ] && [ $mypw == 'abc-123' ];then
echo "welcome root"
else
echo "用户名或密码错误"
exit 1
fi
else
echo "密码不能为空"
exit 1
fi
效果展示:
七、if 高级用法
7.1 条件符号使用双圆括号,可以在条件中植入数学表达式 if (())
[root@shell tmp]# vim if-9.sh
#!/bin/bash
if (( (5+5-5)*5/5 > 10 ))
then
echo "yes"
else
echo "no"
fi
[root@shell tmp]# sh if-9.sh
no
7.2 使用双方括号,可以在条件中使用通配符
通过代码看下 ,为字符串提供高级功能,模式匹配 r* 匹配 r 开头的字符串:
[root@shell tmp]# vim if-10.sh
#!/bin/bash
for var in ab ac rx bx rvv vt
do
if [[ "$var" == r* ]]
then
echo "$var"
fi
done
[root@shell tmp]# sh if-10.sh
rx
rvv
八、简写 if
省去了关键字,条件为真采用 && 符号链接命令块,条件为假采用 || 链接命令块。简写 if 一般用在简单的判断中。
# 案例一
if [ ! -d /tmp/baism ]
then
mkdir /tmp/baism
fi
# 可以简写为:
[ ! -d /tmp/baism ] && mkdir /tmp/baism
# 案例二
if [ $USER == 'root' ]
then
echo "hello root"
else
echo "hello guest"
fi
# 可以简写为:
[ $USER == 'root' ] && echo "hello root" || echo "hello guest"
注:把 then 替换为 &&
把 else 替换为 ||
上一篇文章:【Shell 脚本速成】06、Shell 数组详解_Stars.Sky的博客-CSDN博客
参考文档:shell流程控制-if判断语句-组团学
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74557.html