【Linux系列教程】Shell逻辑控制——条件判断

一、实现条件判断

  • if
  • case

二、简单的if语句

if  条件;  then
    执行的操作
    执行的操作
fi
if  条件;  then
    执行的操作
else
    执行的操作
fi

1.条件的写法

  • [表达式]
    • 数字表达式
    • 字符表达式
    • 文件目录表达式

A.数字表达式

[ 数字1 -eq 数字2 ] 等于
[ 数字1 -ne 数字2 ] 不等于
[ 数字1 -gt 数字2 ] 大于
[ 数字1 -ge 数字2 ] 大于等于
[ 数字1 -lt 数字2 ] 小于
[ 数字1 -le 数字2 ] 小于等于

B.字符表达式

== 等于
!= 不等于
-z 字符 判断是否为空字符

#!/bin/bash
#

read -p "输入密码: " pwd1
read -p "确认密码: " pwd2 

if [ "$pwd1" == "$pwd2" ]; then
   echo "ok"
else
   echo "密码不一致"
fi
#!/bin/bash
#

read -p "用户名: " name
read -p "密码: " password

id $name &> /dev/null
# 判断用户不存在 
if [ $? -ne 0 ]; then	#$?特殊变量,如果为0代表命令执行成功,如果不为0,代表命令执行失败
   useradd $name
   echo $password | passwd --stdin $name &> /dev/null
   echo "用户$name创建完成"
fi

C.文件目录表达式

[ -e 文件目录名称 ] 判断文件目录是否存在
[ -f 文件名称 ] 判断文本文件
[ -d 文件名称 ] 判断是否为目录
[ -b 文件名称 ] 判断是否为块设备文件
[ -l 文件名称 ] 判断是否为链接文件
[ -s 文件名称 ] 判断是否套接字文件
[ -r 文件名称 ] 判断文件是否有权限
[ -w 文件名称 ] 是否有权限
[ -x 文件名称 ] 是否有执行权限
![-参数 文件名称] 取反

拷贝文件,并且判定文件是否存在
#! /bin/bash

read -p "请输入文件:" file
if [ -e $file ]; then
	read -p "请输入要拷贝的路径:" dir
		if [ -e $dir ]; then
			cp $file $dir
			echo "您的文件$file,已经拷贝到了$dir"
		else
			mkdir -p $dir
			cp $file $dir
                	echo "您的文件$file,已经拷贝到了$dir"
		fi
else
	echo "文件不存在,请检查"
fi

三、单分支if

if 条件; then
    执行的操作
    执行的操作
else
	执行的操作
	执行的操作
fi

创建用户

#!/bin/bash
#

read -p "用户名: " name

# 判断用户不存在 
if ! id $name &> /dev/null; then
   read -p "密码: " password
   useradd $name
   echo $password | passwd --stdin $name &> /dev/null
   echo "用户$name创建完成"
else
   echo "用户$name存在"
fi

检查文件有无空行

#! /bin/bash

read -p '请输入文件名:' a
b=$(grep "^$" $a | wc -l) &> /dev/null

if [ $b -eq 0 ] ; then
	echo "此文件没有空行"
else
	echo "此文件存在$b个空行"
fi

检查磁盘容量,使用大于10%告警

#! /bin/bash

read -p '请输入您要查看的磁盘:' name
a=$(df -hT | grep "$name" | awk '{print $1}')
b=$(df -hT | grep "$name" | awk '{print $5}')
c=$(df -hT | grep "$name" | awk '{print $6}')
#${c%%%}去除c变量的百分号
if [ ${c%%%} -gt 10 ]; then
	echo "磁盘名:$a 剩余空间:$b 已使用:$c"
	echo '警告:您的磁盘使用率已经大于10%'
else
	echo "磁盘名:$a 剩余空间:$b 已使用:$c"
	echo "您的磁盘很健康"
fi

网络连通测试

#! /bin/bash

echo '====欢迎使用网络测试工具===='
read -p '请输入IP或域名:' ip
ping -c 2 $ip &> /dev/null
if [ $? -eq 0 ]; then	#$?特殊变量,当值不等于0时,代表命令执行失败
	echo "恭喜你网络畅通!"
else
	echo "网络不可达,请检查后再试!"
fi

四、多分支if

if 条件1; then
	执行的操作
	执行的操作 
elif 条件2; then 
	执行的操作
	执行的操作
elif 条件3; then 
	执行的操作
	执行的操作
else
	执行的操作
	执行的操作
fi 

1.多条件的使用方法

  • and 并且
    • [ 条件1 -a 条件2 ]
    • [ 条件1 ] && [ 条件2 ]
  • or 或者
    • [ 条件1 -o 条件2 ]
    • [ 条件1 ] || [ 条件2 ]

A.判定系统版本

linux显示红帽
windows显示微软
macos显示苹果
其他参数显示其他

#! /bin/bash

read -p '请输入您当前的系统:' sys

if [ $sys == "linux" -o $sys == "Linux" ]; then
	echo "红帽"
elif [ $sys == "windows" -o $sys == "Windows" ]; then
	echo "微软"
elif [ $sys == "macos" -o $sys == "MacOS" ]; then
	echo "苹果"
else
	echo "其他"
fi

五、嵌套if

  • 适用于多层判断
if  条件; then
      if  条件; then
             执行的操作
             执行的操作
      else
             执行的操作
             执行的操作
      fi
else
        执行的操作
        执行的操作
fi

1.创建用户

先判断用户是否存在,如果不存在,需要先创建用户。如果存在判断uid是否等于gid

#! /bin/bash

read -p "请输入用户名:" user

if id $user &> /dev/null; then
	u=$(id -u $user)
	g=$(id -g $user)
	if [ $u -eq $g ]; then
		echo "用户: $user UID: $u GID: $g is a good user!"
	else
		echo "用户: $user UID: $u GID: $g is a bad user!"
	fi
else
	echo "用户$user不存在"
	read -p "是否创建用户$user[y/n]" input
	if [ $input == "y" -o $input == "Y" -o $input == "yes" -o $input == "YES" ]; then
         	useradd $user &> /dev/null
		read -p "给$user创建一个密码:" passwd
		echo $passwd | passwd --stdin $user &> /dev/null
        elif [ $input == "n" -o $input == "N" -o $input == "no" -o $input == "NO" ]; then
             exit 0
        fi
fi

六、case条件判断

  • 适用于判断某个变量有多种固定的取值时
case  变量 in 
值1)
     执行的操作
     执行的操作
     ;; 
值2)
      执行的操作 
      执行的操作
      ;; 
值3)
    执行的操作 
    执行的操作
    ;; 
*)
    执行的操作 
    执行的操作
    ;; 
esac

1.判断操作系统版本

如果用户输入linux输出红帽
输入windows输出微软
输入macos输出苹果
输入其他输出其他

#! /bin/bash

read -p "请输入系统信息:" system

case $system in 
	linux|Linux)
	echo "红帽"
	;;
	windows|Windows)
	echo "微软"
	;;
	macos|MacOS)
	echo "苹果"
	;;
	*)
	echo "其他"
	;;
esac

2.位置变量

$0 命令本身
$1 $2 $3 $4 $5 $6 ......{10} 命令的第x参数,x是后面的数字,后面的数字,后面是数字几,就是第几个参数
$# 参数的个数

3.编写nginx控制脚本

要求脚本可以控制nginxstart启动|stop停止|restart重启|status查看状态|reload重新加载配置

A.安装nginx

[root@localhost ~]# yum install -y gcc openssl-devel zlib-devel pcre-devel 
[root@localhost ~]# tar xf nginx-1.18.0.tar.gz #自行下载nginx压缩包
[root@localhost ~]# cd nginx-1.18.0/
[root@localhost nginx-1.18.0]# ./configure --prefix=/usr/local/nginx && make && make install 

B.脚本

#! /bin/bash

nginx_cmd=/usr/local/nginx/sbin/nginx
nginx_pid=/usr/local/nginx/logs/nginx.pid

#判断是否携带参数
if [ $# -eq 0 ]; then	#如果参数为0,退出命令,并且提示帮助信息
	echo "关于$0的帮助: start启动|stop停止|restart重启|status查看状态|reload重新加载配置"
	exit 1	#命令执行错误后,退出的状态码为1
fi
#判断Nginx服务器
case $1 in
	start)
		$nginx_cmd &> /dev/null
		if [ $? -eq 0 ]; then	#判断上一条命令是否执行成功
			echo "Nginx服务成功启动"
			netstat -tunlp | grep -i nginx	#查看端口
		else
			echo "Nginx服务可能已经启动了,或启动失败"
			netstat -tunlp | grep -i nginx
		fi
		;;
	stop)
		$nginx_cmd -s stop &> /dev/null
		if [ $? -eq 0 ]; then
			echo "Nginx服务成功停止"
		else
			echo "Nginx服务停止失败"
		fi
		;;
	restart)
		$nginx_cmd -s restart &> /dev/null
		if [ -e $nginx_pid ]; then	#判断PID文件是否存在
			echo "Nginx服务重启成功"
		else
			echo "Nginx服务重启失败"
		fi
		;;
	status)
		if [ -e $nginx_pid ]; then
			echo "Nginx服务正在运行"
		else
			echo "Nginx服务未运行"
		fi
		;;
	reload)
		kill -1 `cat $nginx_pid`	#使用kill -1命令重新加载配置文件,不影响服务正常运行
		;;
	*)	#如果输入了其他未设定的参数,同样错误状态退出,并且提示帮助信息
		echo "关于$0的帮助: start启动|stop停止|restart重启|status查看状态|reload重新加载配置"
		exit 1	#命令执行错误后,退出的状态码为1
		;;
esac