shell流程控制-if
.if判断基本概述
1.什么是if?
if就是模仿人类的判断来进行的,但它没有人类那么有情感,
只有 True和 False这两种结果。
2.为什么要使用if?
当我们在写程序的时候,是否经常需要对上一步的执行结果
进行判断。那么判断就需要使用if语句来实现。
if语句在我们程序中主要就是用来做判断的,不管大家以后学
习什么语言,以后只要涉及到判断的部分,大家就可以直接
拿if来使用,不同的语言之间的 if只是语法不同,原理是相同
的
3.if的基础语法
3.if的基础语法 1.单分支结构
if [ $1 -eq $2];then
echo "ok"
fi
2.双分支结构
# 双分支语法 双分支代码示例 2 if [ 如果你有房 ];then if [ $1 -eq $2 ];then 3 我就嫁给你 echo "ok!" 4 else else 5 再见 echo "error!" 6 fi fi
3.多分支结构
# 多分支结构 多分支代码示例 2 if [ 如果你有房 ];then 3 我就嫁给你 4 elif [ 你有车 ];then 5 我就嫁给你 6 elif [ 你有钱 ];then 7 我就嫁给你 8 else 9 再见 10 fi
示例:
需求1:单分支,判断当前用户是不是root,如果不是那么返
回“ERROR”
if [ $USER != 'root' ];then echo "ERROR" exit fi
需求2:双分支,判断当前登录用户是管理员还是普通用户,
如果是管理员输出”hey admin“ 如果是普通用户输出”hey
guest“
if [ $USER == 'root' ];then echo "hey admin" else echo "hey guest" fi
整数比较
-eq 等于,如:if ["$a" -eq "$b" ]
-ne 不等于,如:if ["$a" -ne "$b" ]
-gt 大于,如:if ["$a" -gt "$b" ]
-ge 大于等于,如:if ["$a" -ge "$b" ]
-lt 小于,如:if ["$a" -lt "$b" ]
-le 小于等于,如:if ["$a" -le "$b" ]
.if基于文件比较
参数 说明
示例
-e 如果文件或目录存在则为真
-s 如果文件存在且至少有一个字符则为真
-d 如果文件存在且为目录则为真
-f 如果文件存在且为普通文件则为真
-r 如果文件存在且可读则为真
-w 如果文件存在且可写则为真
-x 如果文件存在且可执行则为真
练习题:
1·监控内存小于500M和磁盘容量小于10G,则发邮件报警
分析:
1.要获取剩余的内容大小 MB
free -m |awk NR==2'{print $NF}'
2.获取当前 / 分区磁盘剩余的容量 G
df -h |awk NR==6'{print $4}'
Free_Ava=$(free -m | awk '/^Mem/ {print $NF}')
Disk_Ava=$(df -h | awk '/\/$/ {print $4}')
if [ ${Free_Ava} -lt 500 -a ${Disk_Ava%.*} -lt 10 ];then
echo "当前内存和磁盘都不满足..."
result=$(awk -v Free_Ava=${Free_Ava} 'BEGIN { print Free_Ava / 1024 }')
echo "内存: ${result}G"
echo "磁盘: ${Disk_Ava}"
else
echo "当前内存和磁盘都满足..."
result=$(awk -v Free_Ava=${Free_Ava} 'BEGIN { print Free_Ava / 1024 }')
echo "内存: ${result}G"
echo "磁盘: ${Disk_Ava}"
fi
2·写一个Nginx安装脚本, 加入判断,当上一步执行成功在执行下一步,否则退出脚本
if [ -f /root/lock ];then
echo "脚本已被占用"
exit
fi
touch /root/lock
#变量
Ngx_opt=/opt
Ngx_version=nginx-1.19.5
Ngx_ln=nginx
Ngx_install=/usr/local
#测试网络
Local_host=$(ifconfig eth0 | awk 'NR==2 {print $2}')
ping -c1 ${Local_host} &>/dev/null
if [ ! $? -eq 0 ];then
echo " ${Local_host} 网络不通"
fi
# 零:依赖包
yum install lsof gcc redhat-rpm-config libxslt-devel gd-devel perl-ExtUtils-Embed geoip-devel gperftools-devel pcre-devel openssl-devel -y
# 一:下载
if [ ! -f ${Ngx_opt}/${Ngx_version}.tar.gz ];then
wget -O ${Ngx_opt}/${Ngx_version}.tar.gz http://nginx.org/download/nginx-1.19.5.tar.gz
fi
# 二:解压编译
if [ ! -d ${Ngx_opt}/${Ngx_version} ];then
cd ${Ngx_opt} && \
tar xf ${Ngx_version}.tar.gz && \
ln -s ${Ngx_version} ${Ngx_ln}
fi
if [ ! -d ${Ngx_install}/${Ngx_ln} ];then
cd ${Ngx_opt}/${Ngx_ln} && \
./configure --prefix=${Ngx_install}/${Ngx_ln} && \
if [ $? -ne 0 ];then
echo "./configure 失败"
exit
fi
make && \
if [ $? -ne 0 ];then
echo "make 失败"
exit
fi
make install && \
ln -s ${ngx_install}/${ngx_version} ${ngx_install}/${Ngx_ln}
if [ ! -e ${Ngx_install}/${Ngx_ln} ];then
echo "Nginx 编译失败"
exit
fi
else
echo "Nginx已经安装,无法重复安装"
fi
# 三:启动
Port_check=$(lsof -i :80 | wc -l)
if [ ${Port_check} -eq 0 ];then
${Ngx_install}/${Ngx_ln}/sbin/nginx -t &>/dev/null
if [ $? -eq 0 ];then
${Ngx_install}/${Ngx_ln}/sbin/nginx
else
echo "Nginx 配置文件异常,无法启动"
exit
fi
else
Ngx_check=$(lsof -i :80 | grep nginx | wc -l)
if [ ${Ngx_check} -ne 0 ] ;then
echo "Nginx 服务已经启动"
exit
else
kill -9 $(lsof -i :80 | sed 1d | awk '{print $2}' | xargs)
Port_check=$(lsof -i :80 | wc -l)
if [ ${Port_check} -eq 0 ];then
${Ngx_install}/${Ngx_ln}/sbin/nginx -t &>/dev/null
if [ $? -eq 0 ];then
${Ngx_install}/${Ngx_ln}/sbin/nginx
else
echo "Nginx 配置文件异常,无法启动"
exit
fi
fi
fi
fi
rm -f /root/lock
# 四:测试
website_code=$(curl -o /dev/null -s -w %{http_code} "localhost")
If_eth0=$(ifconfig eth0 | awk 'NR==2 {print $2}')
if [ ${website_code} -eq 200 ];then
echo "Nginx 访问成功,请通过 http://${If_eth0} 访问获取页面.."
else
echo "nginx 访问失败,请检查,状态码为: ${website_code}"
fi
3:提示用户输入年份后判断该年是否为闰年(能整除4,并且不能被100整除则为闰年)
read -p "输入年份: " year
if [ $(($year%4)) -eq 0 -a $(($year%100)) -ne 0 ] || [ $(($year%400)) -eq 0 ];then
echo "$year 是润年"
else
echo "$year 是平年"
fi
4:根据用户输入密码位数,生成随机密码(包含数字、大小写字母、特殊符号)
read -p "请输入密码的位数: " Num
if [[ ! ${Num} =~ ^[0-9]+$ ]];then
echo "输入数字"
exit
fi
if [ ${Num} -ge 7 ];then
pw=$(mkpasswd -l $Num)
echo "你的随机密码是 $Num 位,密码如下: $pw"
else
echo "密码的位数必须为大于等于7位"
exit
fi

浙公网安备 33010602011771号