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

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

posted @ 2020-12-05 12:19  JiaZZ  阅读(174)  评论(0)    收藏  举报