【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控制脚本
要求脚本可以控制
nginx
的start启动
|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