目录
一、if 介绍
二、单 if 语法
三、if…else 语句
四、if…elif…else
五、if 嵌套 if
5.1 使用 if 嵌套 if 的方式判断两个整数的关系
5.2 写一个nginx安装初始化脚本
六、if 语句与 shell 运算
6.1 与文件存在与否的判断
6.2 文件权限相关的判断
6.3 整数之间的判断
6.4 字符串之间的判断
6.5 多重条件判断
七、if 高级用法
7.1 条件符号使用双圆括号,可以在条件中植入数学表达式 if (())
7.2 使用双方括号,可以在条件中使用通配符
八、简写 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判断语句-组团学