一,条件测试
1 . test命令
测试表达式是否成立,若成立返回0,否则返回其他数值
1.1 格式
test +条件表达式
[ 条件表达式 ]
2 . 文件测试
2.1 格式
[ 操作符 文件或目录 ]
例
test -d /home/user
2.2 常用的测试操作符
- -d:测试是否为目录(Directory)
- -e:测试目录或文件是否存在(Exist)
- -f:测试是否为文件(File)
- -r:测试当前用户是否有权限读取(Read)
- -w:测试当前用户是否有权限写入(Write)
- -x:测试当前用户是否有权限执行(eXcute)
- -b测试是否为设备文件
- -c测试是否为字符设备文件
- -s测试存在且文件大小为空
- -L测试是否为链接文件
[root@localhost ~]# ls /home
10 12.txt 3002 66 c frist.sh m11 shell_dome.sh wangwu3
10000 14j 3003 6j cc g11 n11 t11 xa
106 1a 330 7j d h11 o11 test2.sh xxx
1061 20000 333 a dd i11 p11 test3.sh zhangsan
106.txt 220 3a a10000 dnn j11 q11 u11
10j 222 44 abc f1 k11 qwe user
110 22.txt 55 b f2 l11 qwert v11
111 2a 56 bnn f3 ll r11 wangwu
12j 3001 5j bsb f4 ltxt s11 wangwu2
[root@localhost ~]# [ -f /home/10 ] && echo "YES"
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -f /home/10 ] && echo "YES"
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -f /home/12.txt ] && echo "YES"
YES
[root@localhost ~]# [ -d /home/12.txt ] && echo "YES"
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -d /home/10 ] && echo "YES"
YES
[root@localhost ~]# [ ! -d /home/kfc ] && mkdir /home/kfc
[root@localhost ~]# ls /home
10 12.txt 3002 66 c frist.sh ltxt s11 wangwu2
10000 14j 3003 6j cc g11 m11 shell_dome.sh wangwu3
106 1a 330 7j d h11 n11 t11 xa
1061 20000 333 a dd i11 o11 test2.sh xxx
106.txt 220 3a a10000 dnn j11 p11 test3.sh zhangsan
10j 222 44 abc f1 k11 q11 u11
110 22.txt 55 b f2 kfc qwe user
111 2a 56 bnn f3 l11 qwert v11
12j 3001 5j bsb f4 ll r11 wangw
3 . 整数值比较
3.1 格式
[ 整数1 操作符 整数2]
3.2 常用的测试操作符
- -eq: 等于(Equal)
- -ne:不等于(Not Equal)
- -gt: 大于(Greater Than)
- -It:小于(Lesser Than)
- -le:小于或等于(Lesser or Equal)
- -ge:大于或等于(Greater or Equal)
[root@localhost ~]# who |wc -l
4
[root@localhost ~]# [$(who |wc -l) -ge 10] && echo "> = 10 "
bash: [4: 未找到命令...
[root@localhost ~]# [ $(who |wc -l) -gt 5 ] && echo "Too many"
[root@localhost ~]# [ $(who |wc -l) -gt 2 ] && echo "Too many"
Too many
[root@localhost ~]# who
root :0 2024-07-14 07:03 (:0)
root pts/0 2024-07-17 08:32 (192.168.72.1)
root pts/1 2024-07-17 13:33 (192.168.72.1)
root pts/2 2024-07-15 20:15 (:0)
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 3774 1067 818 11 1888 2403
Swap: 4767 0 4767
[root@localhost ~]# free -m|grep "Mem"
Mem: 3774 1067 818 11 1888 2403
[root@localhost ~]# free -m|grep "Mem"|awk '{print $6}'
1888
[root@localhost ~]# FREE=$(free -m|grep "Mem"|awk '{print $6}')
t@localhost ~]# echo $FREE
1888
root@localhost ~]# FREE=$(free -m|grep "Swap"|awk '{print $2}')
[root@localhost ~]# echo $FREE
4767
[root@localhost ~]# FREEE=$(free -m|grep "Mem"|awk '{print $2}')
[root@localhost ~]# echo $FREEE
3774
[root@localhost ~]# [ $FREEE -le 4096 ] && echo "内存还有空间,还可以存储"
内存还有空间,还可以存储
[root@localhost ~]# FREE=$(free -m|grep "Mem"|awk '{print $3}')
[root@localhost ~]# echo $FREE
1064
[root@localhost ~]# [ $FREE -ge 1024 ] && echo "内存资源不足,请尽快处理"
内存资源不足,请尽快处理
4 . 字符串比较
4.1 格式
[ 字符串1=字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
4.2 常用的测试操作符
- =: 字符串内容相同
- !=: 字符串内容不同,!号表示相反的意思
- -z :字符串内容为空
[root@localhost ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US
[root@localhost ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes
[root@localhost ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖
[root@localhost ~]# kkk7=
[root@localhost ~]# [ -z $kk7 ] && echo "空字符串"
空字符串
[root@localhost ~]# a=13
[root@localhost ~]# b=15
[root@localhost ~]# [ $a = $b ] && echo true
[root@localhost ~]# [ $a != $b ] && echo true
true
5 . 逻辑测试
5.1 格式
[表达式1]操作符[表达式2]…
命令1 操作符 命令2 …
5.2 常用的测试操作符
- -a或&&:逻辑与,“而且”的意思
- -o或|:逻辑或,“或者”的意思
- !: 逻辑否
[root@localhost ~]# [ -d /opt/100 ] && [ -r /home/10 ] && echo "目录和全向都有"
目录和全向都有
[root@localhost ~]# [ -d /opt/100 ] && [ -r /home/100 ] && echo "yes no"
[root@localhost ~]# [ -d /opt/100 ] && [ -r /home/10 ] && echo "yes no"
yes no
[root@localhost ~]# uname -r
3.10.0-693.el7.x86_64
[root@localhost ~]# uname -r|awk -F. '{print $1}'
3
[root@localhost ~]# XXL=`uname -r|awk -F. '{print $1}'`
[root@localhost ~]# echo $XXL
3
[root@localhost ~]# [ $XXL -ge 3 ] && echo "系统内核符合要求"
系统内核符合要求
[root@localhost ~]# [ $XXL -ge 3 ] && echo "系统内核符合要求"
系统内核符合要求
[root@localhost ~]# XLL=`uname -r|awk -F. '{print $2}'`
[root@localhost ~]# echo $XLL
10
[root@localhost ~]# [ $XXL -ge 3 ] && [ $XLL -ge 9 ] && echo "系统内核符合要求"
系统内核符合要求
二,if语句
- if单分支语句
- if双分支语句
- if多分支语句
1 . if单分支语句
判断目录是否存在,查询目录文件
[root@localhost ~]# vim demo03.sh
[root@localhost ~]# ch
chacl check-binary-files chmod
chage checkisomd5 chown
chardetect checkmodule chpasswd
charmap checkpolicy chronyc
chat checksctp chronyd
chattr cheese chroot
chcat chfn chrt
chcon chgrp chsh
chcpu chkconfig chvt
[root@localhost ~]# chmod +x demo03.sh
[root@localhost ~]# ./demo03.sh
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL
ok
[root@localhost ~]# ls /mnt
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL
[root@localhost ~]#
判断段挂载点在不在
[root@localhost ~]# vim demo06.sh
#!/bin/bash
# 定义变量
MOUNT_DIR="/media/cdrom/"
# 判断没有这个目录就创建
if [ ! -d "$MOUNT_DIR" ]; then
mkdir -p "$MOUNT_DIR"
fi
~
[root@localhost ~]# chmod +x demo06.sh
[root@localhost ~]# ./demo06.sh
[root@localhost ~]# ls /media/cdrom
10 大于9
[root@localhost ~]# vim demo04.sh
#!/bin/bash
if [ 10 -gt 9 ]
then
echo "true"
fi
~
[root@localhost ~]# chmod +x demo04.sh
[root@localhost ~]# ./demo04.sh
true
判断是不是脚本
[root@localhost /home/jiaoben]# vim demo07.sh
#!/bin/bash
read -p "请输入您的文件名:" RILE
if [ $FILE==*.sh ]
then
echo "该文件是脚本文件"
fi
~
[root@localhost /home/jiaoben]# chmod +x demo07.sh
[root@localhost /home/jiaoben]# ./demo07.sh
请输入您的文件名:oo
该文件是脚本文件
检查用户输入的字符串是否首尾是否为数字
[root@localhost /home/jiaoben]# vim demo08.sh
#!/bin/bash
#需求检查用户输入的字符串是否首尾包含除了数字
#1,定义变量交互
read -p "请输入你的字符串:" ATTR
#2,判断所输入的字符串是否符合要求
if [[ $ATTR == *[0-9]* ]]
then
echo "ok"
fi
~
[root@localhost /home/jiaoben]# chmod +x demo08.sh
[root@localhost /home/jiaoben]# ./demo08.sh
请输入你的字符串:ijnkjnk
[root@localhost /home/jiaoben]# ./demo08.sh
请输入你的字符串:1ergjk
ok
[root@localhost /home/jiaoben]# ./demo08.sh
请输入你的字符串:hjii9
ok
2 . if双分支语句
ping
[root@localhost /home/jiaoben]# vim demo09.sh
#!/bin/bash
IP=192.168.72.30
ping -c 5 -i 0.5 -w 5 $IP &> /dev/null
if [ $? -eq 0 ]; then
echo "$IP is up"
else
echo "$IP is down"
fi
~
[root@localhost /home/jiaoben]# chmod +x demo09.sh
[root@localhost /home/jiaoben]# ./demo09.sh
192.168.72.30 is up
查看用户是否已经添加如果没有就新建
[root@localhost /home/jiaoben]# vim demo11.sh
#!/bin/bash
read -p "请输入用户名:" name
id $name &> /dev/null
if [ $? -eq 0 ];then
echo "该用户已存在!"
else
useradd $name
echo "123" | passwd --stdin $name &> /dev/null
echo "创建用户$name,密码已设置"
fi
~
[root@localhost /home/jiaoben]# chmod +x demo11.sh
[root@localhost /home/jiaoben]# ./demo11.sh
请输入用户名:XXK
创建用户XXK,密码已设置
[root@localhost /home/jiaoben]# ./demo11.sh
请输入用户名:XXK
该用户已存在!
查找目录是否存在
[root@localhost /home]# vim demo13.sh
#!/bin/bash
read -p "请输入需要查找的目录名:" name
# 使用 find 命令查找目录,并将结果保存到变量 ZZZ 中
ZZZ=$(find / -type d -name "$name" -print -quit 2>/dev/null)
# 判断变量 ZZZ 是否为空,即是否找到了目录
if [ -n "$ZZZ" ]; then
echo "目录已存在:$ZZZ"
else
echo "目录不存在"
fi
~
[root@localhost /home]# ./demo13.sh
请输入需要查找的目录名:aaa
目录已存在:/home/aaa
[root@localhost /home]# ./demo13.sh
请输入需要查找的目录名:uii
目录不存在
查看httpd服务,是否启动
[root@localhost /home]# vim demo14.sh
#!/bin/bash
netstat -natup|grep ":80" &> /dev/null
if [ $? -eq 0 ]
then
echo "网站服务已 运行!"
else
echo "启动http服务"
yum install -y http > /dev/null
systemctl start httpd
fi
~
[root@localhost /home]# ./demo14.sh
网站服务以运行!
3 . if多分语句
分数
[root@localhost /home]# vim demo15.sh
#!/bin/bash
read -p "请输入分数:" CHAOXIE
if [ $CHAOXIE -ge 80 ] && [ $CHAOXIE -le 100 ]
then
echo " $CHAOXIE分,优 "
elif [ $CHAOXIE -ge 60 ] && [ $CHAOXIE -le 79 ]
then
echo " $CHAOXIE分,良 "
else
echo " $CHAOXIE分,差 "
fi
~
[root@localhost /home]# ./demo15.sh
请输入分数:81
81分,优
[root@localhost /home]# ./demo15.sh
请输入分数:61
61分,良
[root@localhost /home]# vim demo15.sh
[root@localhost /home]# ./demo15.sh
请输入分数:59
59分,差
查看时间是上午下午中文晚上凌晨
[root@localhost /home]# vim demo21.sh
#!/bin/bash
# 定义时间
TIME=$(date +%H)
if [ $TIME -ge 6 -a $TIME -lt 11 ]; then
echo "现在是上午"
elif [ $TIME -ge 11 -a $TIME -lt 13 ]; then
echo "现在是中午"
elif [ $TIME -ge 13 -a $TIME -lt 18 ]; then
echo "现在是下午"
elif [ $TIME -ge 18 -a $TIME -lt 24 ]; then
echo "现在是晚上"
else
echo "现在是凌晨"
fi
~
[root@localhost /home]# chmod +x demo21.sh
[root@localhost /home]# ./demo21.sh
现在是下午
查看文件类型
[root@localhost /home]# ./demo23.sh
#!/bin/bash
# 提示用户输入文件路径
read -p "请输入文件路径: " name
# 判断文件类型并输出结果
if [ -d $name ]; then
echo "这是一个目录"
elif [ -f $name ]; then
echo "这是一个普通文件"
elif [ -L $name ]; then
echo "这是一个符号链接"
elif [ -b $name ]; then
echo "这是一个块设备文件"
elif [ -c $name ]; then
echo "这是一个字符设备文件"
elif [ -p $name ]; then
echo "这是一个命名管道(FIFO)"
elif [ -S $name ]; then
echo "这是一个套接字"
else
echo "无法判断文件类别"
fi
~
[root@localhost /home]# chmod +x demo23.sh
[root@localhost /home]# ./demo23.sh
请输入文件路径: /home/3001
这是一个符号链接
[root@localhost /home]# ./demo23.sh
请输入文件路径: 14j
这是一个普通文件
[root@localhost /home]# ./demo23.sh
请输入文件路径: /home/u11
这是一个目录
4 . 嵌套if语句
查看httpd服务
[root@localhost /home]# vim demo12.sh
#!/bin/bash
#set -x
ps aux | grep httpd | grep -v grep &> /dev/null
if [ $? -ne 0 ]; then
# 检查 httpd 是否已安装
if rpm -q httpd | grep -q "未安装软件包 httpd"; then
echo "httpd 未安装,正在安装..."
yum -y install httpd > /dev/null
echo "httpd 已安装,正在启动..."
systemctl start httpd
else
echo "httpd 已安装,但未运行,正在启动..."
systemctl start httpd
fi
else
echo "httpd 正在运行"
fi
~
[root@localhost /home]# chmod +x demo12.sh
[root@localhost /home]# ./demo12.sh
+ ps aux
+ grep httpd
+ grep -v grep
+ '[' 0 -ne 0 ']'
+ echo 'httpd 正在运行'
httpd 正在运行
[root@localhost /home]# vim demo12.sh
[root@localhost /home]# ./demo12.sh
httpd 正在运行
[root@localhost /home]# systemctl stop httpd.service
[root@localhost /home]# ./demo12.sh
httpd 已安装,但未运行,正在启动...
[root@localhost /home]# ./demo12.sh
httpd 正在运行
三,case分支语句
查看账户
[root@localhost /home]#vim demo24.sh
#!/bin/bash
# 提示输入用户名
read -p "请输入用户名:" user
# 检查用户是否存在
if grep -q "^$user:" /etc/passwd; then
# 检查用户是否有家目录
if [ -d /home/$user ]; then
echo "该用户状态正常"
else
read -p "该用户没有家目录,是否删除该用户,请输入[yes/no]:" ask
case $ask in
yes)
echo "正在删除用户..."
userdel -r $user &> /dev/null
sleep 2
echo "该用户已删除"
;;
no)
exit
;;
*)
echo "无效的输入,请输入 yes 或 no"
;;
esac
fi
else
echo "该用户不存在"
fi
~
[root@localhost /home]# chmod +x demo24.sh
[root@localhost /home]# useradd testuser1
[root@localhost /home]#useradd testuser2 -M
[root@localhost /home]# ./demo24.sh
请输入用户名:testuser1
该用户状态正常
[root@localhost /home]# ./demo24.sh
请输入用户名:testuser2
该用户没有家目录,是否删除该用户,请输入[yes/no]:yes
正在删除用户...
该用户已删除
[root@localhost /home]# useradd testuser2 -M
[root@localhost /home]# ./demo24.sh
请输入用户名:testuser2
该用户没有家目录,是否删除该用户,请输入[yes/no]:no
[root@localhost /home]#
根据输入的判断是字母还是数字还是特殊字符
[root@localhost /home]# vim demo26.sh
#!/bin/bash
read -p "请输入您的分数(0~100):" CJ
# 检查输入是否为有效的数字且在 0 到 100 之间
if [ "$CJ" -ge 0 ] 2>/dev/null && [ "$CJ" -le 100 ] 2>/dev/null; then
# 检查分数范围并设定变量 a
if [ $CJ -ge 85 -a $CJ -le 100 ]; then
a="great"
elif [ $CJ -ge 70 -a $CJ -lt 85 ]; then
a="standard"
elif [ $CJ -ge 0 -a $CJ -lt 70 ]; then
a="false"
fi
# 使用 case 语句输出结果
case $a in
great)
echo "$CJ分,优秀"
;;
standard)
echo "$CJ分,合格"
;;
false)
echo "$CJ分,不合格"
;;
esac
else
echo "输入有误,请输入一个0到100之间的整数。"
fi
~
[root@localhost /home]# bash -n demo26.sh
[root@localhost /home]# chmod +x demo26.sh
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):99
99分,优秀
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):101
输入有误,请输入一个0到100之间的整数。
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):199
输入有误,请输入一个0到100之间的整数。
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):60
60分,不合格
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):70
70分,合格
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):85
85分,优秀
根据输入的成绩判断是优秀还是合格不合格
[root@localhost /home]# vim demo26.sh
#!/bin/bash
read -p "请输入您的分数(0~100):" CJ
# 检查输入是否为有效的数字且在 0 到 100 之间
if [ "$CJ" -ge 0 ] 2>/dev/null && [ "$CJ" -le 100 ] 2>/dev/null; then
# 检查分数范围并设定变量 a
if [ $CJ -ge 85 -a $CJ -le 100 ]; then
a="great"
elif [ $CJ -ge 70 -a $CJ -lt 85 ]; then
a="standard"
elif [ $CJ -ge 0 -a $CJ -lt 70 ]; then
a="false"
fi
# 使用 case 语句输出结果
case $a in
great)
echo "$CJ分,优秀"
;;
standard)
echo "$CJ分,合格"
;;
false)
echo "$CJ分,不合格"
;;
esac
else
echo "输入有误,请输入一个0到100之间的整数。"
fi
~
[root@localhost /home]# bash -n demo26.sh
[root@localhost /home]# chmod +x demo26.sh
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):99
99分,优秀
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):101
输入有误,请输入一个0到100之间的整数。
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):199
输入有误,请输入一个0到100之间的整数。
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):60
60分,不合格
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):70
70分,合格
[root@localhost /home]# ./demo26.sh
请输入您的分数(0~100):85
85分,优秀