目录
一、条件测试
条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成
若真,则状态码变量 $? 返回0
若假,则状态码变量 $? 返回1
1.1 test命令测试
格式1:test [操作符选项] 条件表达式
格式2:[ 操作符 条件表达式 ]
常见的测试操作符 | 含义 |
---|---|
-d | 测试是否为目录(directory) |
-e | 测试目录或文件是否存在(Exist) |
-f | 测试是否为文件(File) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否有权限执行(eXcute) |
-x | 测试当前用户是否有权限执行(eXcute) |
-l | 测试是否为软连接文件 |
-nt | 判断文件A是否比文件B新 |
-ot | 判断文件A是否比文件B旧 |
-ef | 判断两个文件是否为同一文件 |
1.2 整数数值比较
格式:
[ 整数1 操作符 整数 ] 公式
选项:
- -eq:第一个数等于(Equal)第二个数
- -ne:第一个数不等于(Not Equal)第二个数
- -gt:第一个数大于(Greater Than)第二个数
- -lt:第一个数小于(Lesser Than)第二个数
- -le:第一个数小于或等于(Lesser or Equal)第二个数
- -ge:第一个数大于或等于(Greater or Equal)第二个数
1.3 字符串比较
常用的测试操作符
-
=:字符串内容相同
-
!=:字符串内容不同,! 号表示相反的意思
-
-z:字符串内容为空
-
-n: 字符是否存在
1.4 逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
常见条件
- -a或&&:逻辑与,全真为真,一假即为假
- -o或||:一真为真 全假为假
- !:逻辑否
标准写法:
cmd1 && cmd2 || cmd3
二、if条件语句
2.1 单分支if
if 判断条件
then
命令语句
else
命令语句
fi
实例:判断是否为超级管理员
#!/bin/bash
if [ "$USER" != "root" ]
then
echo "非管理员用户无权限操作"
else
echo "是管理员用户"
fi
2.2 双分支if
if 判断条件; then
条件为真的分支代码else
条件为假的分支代码fi
实例:判断服务器是否开启
#!/bin/bash
ss -natp|grep 80 //过滤80端口
if [ $? -eq 0 ]
then
echo "服务器已开启"
else
systemctl start httpd &>/dev/null
if [ $? -eq 0 ]
then
echo "httpd 服务已开启"
else
echo "httpd 服务启动失败"
fi
fi
2.3 多分支if
if 判断条件1
then
条件1为真的分支代码elif 判断条件2
then
条件2为真的分支代码elif 判断条件3;then
条件3为真的分支代码...
else
以上条件都为假的分支代码 托底fi
实例1:判断分数
#!/bin/bash
read -p "请输入你的分数(0-100 正整数):" num
if [ $num -ge 90 -a $num -le 100 ]
then
echo "优秀"
elif [ $num -ge 70 -a $num -lt 90 ]
then
echo "良好"
elif [ $num -ge 60 -a $num -lt 70 ]
then
echo "及格"
elif [ $num -lt 60 ]
then
echo "罚抄20遍"
else
echo "输入有误,请输入0-100 之间的正整数"
bash $0
fi
实例2:石头剪刀布小游戏
#!/bin/bash
#1 布 2锤子 3 剪刀
read -p "请输入 1布 2锤子 3剪刀:" human
m=`echo $[RANDOM%3+1]`
if [ $human -eq $m ]
then
echo "人机 打平"
elif [ $human -eq 1 -a $m -eq 2 -o $human -eq 2 -a $m -eq 3 -o $human -eq 3 -a $m -eq 1 ]
then
echo "你赢了"
else
echo "你输了"
fi
实例3:新建用户名字
#!/bin/bash
read -p "请输入你要新建用户的 名字:" name
grep -q $name /etc/passwd
if [ $? -eq 0 ]
then
echo "该用户已存在"
exit
else
useradd $name
pass=`cat /dev/random |tr -dc [[:alnum:]]|head -c 12`
echo $pass |passwd $name --stdin
echo $pass >> /opt/pass.txt
fi
实例4:判断主机连通性
#!/bin/bash
read -p "请输入 最后一位ip地址1-254:" num
ping -c1 -W2 192.168.76.${num} &>/dev/null
if [ $? -eq 0 ]
then
echo "主机 $num is onlien"
else
echo "主机 $num is offlien"
fi
三、case语句
格式:
case $变量 in
1)
命令序列1
;;
2)
命令序列2
;;
.......
*)
;;
esac
实例1:输入yes或者no
#!/bin/bash
read -p "请输入yes 或no:" key
case $key in
[yY][eE][sS]|[yY])
echo "你输入的是yes"
;;
[nN]|[nN][oO])
echo "你输入的是no"
;;
*)
echo "输入有误请重新输入"
bash $0
;;
esac
实例2:工具箱操作
#!/bin/bash
cat <<EOF
1.关闭防火墙
2.临时关闭selinux
3.查看当前用户
EOF
read -p "请选择操作(1-3):" key
case $key in
1)
systemctl stop firewalld;
;;
2)
setenforce 0
;;
3)
user=`whoami`
echo "当前用户$user"
;;
*)
echo "输出错误,请输入1-3进行选择"
esac