目录
7.1 条件符号使用双圆括号,可以在条件中植入数学表达式 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/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 [ 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 [ 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 ]
- 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嵌套
- #!/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
效果展示

案例需求
写一个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 为标准错误输出
- -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
- -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
- -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
- -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
效果展示:

- # 逻辑判断符号:
- && (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
效果展示:

- [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
通过代码看下 ,为字符串提供高级功能,模式匹配 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 [ ! -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判断语句-组团学