目录
一、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
如何写一个高可用性的脚本,赋予脚本智能化,赋予脚本执行逻辑。
比如nginx安装脚本中
answer: 加入判断
只要你想在代码中判断一下的时候就第一时间想到if就行了,适用于99%的语言。
当我们在写程序的时候,时常对上一步执行是否成功如何判断苦恼,当我们今天学习了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/bashif [ $USER != 'root' ]thenecho "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 [ condition ] # 条件判断 then # 条件为真commands1 # 真 要执行代码块
else # 条件为假commands2 # 假 要执行的代码块
fi # 结束
通过一段代码演示一下吧,判断当前登录用户是管理员还是普通用户,如果是管理员输出“hey admin”; 如果是普通用户输出“hey guest”:
[root@shell tmp]# vim if-2.sh
#!/bin/bashif [ $USER == 'root' ]
thenecho "hey admin"
elseecho "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 [ condition 1] 满足第一个条件then 真command1 执行 command1 代码块
elif [ condition 2] 满足第二个条件then 真commands2 执行 command2 代码块.......
else 如果条件都不满足commandsX 执行 commandX 代码块
fi 结束判断
通过一段代码演示一下吧,通过一个脚本,判断两个整数的关系
案例需求
判断内存的使用率
案例思考
内存使用率获得方式
案例代码
[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 ]
thenecho -e "\033[31m 警告 \033[0m"
elif [ $1 -gt 70 ]
thenecho -e "\033[35m 警告 \033[0m"
elif [ $1 -gt 60 ]
thenecho -e "\033[33m 警告 \033[0m"
elseecho -e "\033[32m OK \033[0m"
fi# 注意事项:
如果多条件判断存在包含的关系,需要从最严格开始判断;否则,后面的就不会生效
如果你第一个判断的是60以上,那么 70 80 都符合第一个条件。所以后面的判断70 80 就没有任何意义
效果展示
关于脚本外传参:shell 内置变量
- 本程序的名字: $0
- 本程序执行进程号是:$$
- 上条命令执行结果是:$?
- 传入参数的数量是:$#
- 传入的第2个参数是:$2
- 传入的参数列表:$@
脚本外传参的执行方法:脚本名字 参数1 参数2 ...(如上面的脚本执行方式)
脚本内部调用的方法 :$1 $2 ... $N
特点:减少用户交互
当有多步判断的时候,可以使用if嵌套
#!/bin/bashif [ $1 -eq $2 ];thenecho "$1 = $2"
elseif [ $1 -gt $2 ];thenecho "$1 > $2"elseecho "$1 < $2"fi
fi
效果展示
案例需求
写一个nginx业务初始化脚本,完成nginx软件自动安装。
案例思考
案例步骤
案例代码
[root@shell tmp]# vim nginx_install.sh
#!/bin/bashsource_pkg=nginx-1.19.2.tar.gz
#1、软件包下载
wget http://nginx.org/download/$source_pkg
#2、解压
if [ -f $source_pkg ];thentar xf $source_pkg && cd nginx-1.19.2
elseecho "not found $source_pkg"exit 1
fi#3、安装依赖包
if ! ( yum -y install pcre-devel zlib-devel );thenecho "yum: install soft error"exit 1
fi#4、配置
#判断配置语句执行结果
if ./configure 1>/dev/null then#判断make执行结果if make 1>/dev/nullthen#判断make install安装结果if make install 1>/dev/nullthenecho "nginx 安装成功"elseecho "nginx 安装失败"exit 1fielseecho "make fail"exit 1fi
elseecho "configure fail"exit 1
fi#./configure 等价于 if [ $? -eq 0 ];then#注意: 1>/dev/null
1 为标准输出
2 为标准错误输出
-e 是否存在 不管是文件还是目录,只要存在,条件就成立
-f 是否为普通文件
-d 是否为目录
-S socket
-p pipe
-c character
-b block
-L 软link
案例演示
# 判断/tmp/test目录,如果没有则创建它
[root@shell tmp]# vim if-5.sh
#!/bin/bashif [ ! -d /tmp/test ];thenmkdir -pv /tmp/test
fi[root@shell tmp]# sh if-5.sh
mkdir: 已创建目录 "/tmp/test"
[root@shell tmp]# ls
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
-u 是否有suid
-g 是否sgid
-k 是否有t位
案例演示:
[root@shell tmp]# vim if-6.sh
#!/bin/bashif [ -x /tmp/test/linux ];then/tmp/test/linux
elseecho "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
-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 ];thenecho "$1 < $2"
elseecho "$1 = $2"
fi
-z 是否为空字符串 字符串长度为0,就成立
-n 是否为非空字符串 只要字符串非空,就是成立
string1 == string2 是否相等
string1 != string2 不等
案例演示:
[root@shell tmp]# vim if-7.sh
#!/bin/bash
# 交互式输入用户名 密码
read -p "user: " myuser
if [ -z "$myuser" ];thenecho "用户名为空!"exit 1
fi# 从外往里写嵌套 if
read -p "password: " mypw
if [ -n "$mypw" ];then# 判断用户名if [ $myuser == "root" ];then# 判断密码if [ $mypw == "root" ];thenecho "welcome root~"elseecho "密码错误!"exit 1fielseecho "用户名错误!"exit 1fi elseecho "密码不能为空!"exit 1
fi
效果展示:
# 逻辑判断符号:
&& (and 逻辑与) 两个条件同时满足,整个大条件为真
|| (or 逻辑或) 两个条件满足任意一个,整个大条件为真
! 非运算
案例演示:
[root@shell tmp]# vim if-8.sh
#!/bin/bash
# 交互式输入用户名 密码
read -p "user: " myuser
if [ -z "$myuser" ];thenecho "用户名为空!"exit 1
fi# 从外往里写嵌套 if
read -p "password: " mypw
if [ -n "$mypw" ];thenif [ $myuser == 'root' ] && [ $mypw == 'abc-123' ];thenecho "welcome root"elseecho "用户名或密码错误"exit 1fielseecho "密码不能为空"exit 1
fi
效果展示:
[root@shell tmp]# vim if-9.sh
#!/bin/bashif (( (5+5-5)*5/5 > 10 ))thenecho "yes"
elseecho "no"
fi[root@shell tmp]# sh if-9.sh
no
通过代码看下 ,为字符串提供高级功能,模式匹配 r* 匹配 r 开头的字符串:
[root@shell tmp]# vim if-10.sh
#!/bin/bashfor var in ab ac rx bx rvv vtdoif [[ "$var" == r* ]]thenecho "$var"fi
done[root@shell tmp]# sh if-10.sh
rx
rvv
省去了关键字,条件为真采用 && 符号链接命令块,条件为假采用 || 链接命令块。简写 if 一般用在简单的判断中。
# 案例一
if [ ! -d /tmp/baism ]thenmkdir /tmp/baism
fi# 可以简写为:
[ ! -d /tmp/baism ] && mkdir /tmp/baism# 案例二
if [ $USER == 'root' ]thenecho "hello root"
elseecho "hello guest"
fi# 可以简写为:
[ $USER == 'root' ] && echo "hello root" || echo "hello guest"注:把 then 替换为 &&
把 else 替换为 ||
上一篇文章:【Shell 脚本速成】06、Shell 数组详解_Stars.Sky的博客-CSDN博客
参考文档:shell流程控制-if判断语句-组团学