1. 条件判断
1.文件判断
作用:
判断文件的各种属性及状态,比如文件是否存在,是否有可读可写可执行权限
语法:
参数 | 说明 | 举例 |
---|---|---|
-e | 如果文件或目录存在则为真-常用 | [ -e file ] |
-s | 如果文件存在且至少有一个字符则为真 | [ -s file ] |
-d | 如果文件存在且为目录则为真-常用 | [ -d file ] |
-f | 如果文件存在且为普通文件则为真-常用 | [ -s file ] |
-r | 如果文件存在且可读则为真 | [ -r file ] |
-w | 如果文件存在且可写则为真 | [ -w file ] |
-x | 如果文件存在且可执行则为真 | [ -x file ] |
真 假
正确 不正确
举例:
[ -e 文件路径 ] && 结果为真执行的动作 || 结果为假执行的动作
[ -e /etc/passwd ] && echo "文件已存在" || echo "文件不存在"
[ -d /data ] && echo "目录已存在" || mkdir /data
[ -f /data ] && echo yes || echo no
练习题:
需求:
判断ssh秘钥是否已存在,如果已经存在则提醒已存在,如果不存在则创建
ssh-keygen -f /root/.ssh/id_rsa -N ''
create_ssh=$(ssh-keygen -f /root/.ssh/id_rsa -N '')
[ -f /root/.ssh/id_rsa ] && echo "已存在" || $create_ssh
2.字符串判断
作用:
判断字符串是否相等或者不等
参数:
参数 | 说明 | 举例 |
---|---|---|
== | 等于则条件为真 | [ "$a" == "$b" ] |
!= | 不等于则条件为真 | [ "$a" != "$b" ] |
-z | 字符串没有内容则为真 | [ -z "$a" ] |
-n | 字符串有内容则为真 | [ -n "$a" ] |
举例:
[ "abc" == "aaa" ] && echo ok || echo no
[ "abc" != "aaa" ] && echo ok || echo no
[ -z "abc" ] && echo ok || echo no
[ -n "abc" ] && echo ok || echo no
[ -n "" ] && echo ok || echo no
练习题:编写登录验证脚本:
已知有以下文本:
cat > user_info.txt << EOF
user1:123
user2:321
user3:456
EOF
需求:
1.提醒用户输入账号和密码
2.判断账号密码是否为空
3.判断账号和密码是否匹配
分解:
第一步: 提醒用户输入账号和密码
read -p '账号:' name
read -p '密码:' pswd
第二步: 判断账号密码是否为空
read -p '账号:' input_name
[ -n "$name" ] && echo "" || exit
read -p '密码:' input_pass
[ -n "$pass" ] && echo "" || exit
第三步: 判断账号密码是否正确
read -p '账号:' input_name
[ -n "$input_name" ] && echo "" || exit
read -p '密码:' input_pass
[ -n "$sed -rn '/^user1:/s#(.*):.*#\1#gp' user_info.txt" ] && echo "" || exit
user_passwd=$(sed -rn "/$input_name/s#.*:(.*)#\1#p")
[ "$input_pass" == "user_passwd" ] && 登录成功 || echo "密码不正确"
第四步: 判断账号是否存在
read -p '账号:' input_name
[ -n "$input_name" ] && echo "---" || exit
[ -n "$(sed -rn "/^$input_name:/s#(.*):.*#\1#p" user_info.txt)" ] && echo "---"||exit
read -p '密码:' input_pass
[ -n "$input_pass" ] && echo "---" || exit
user_passwd=$(sed -rn "/$input_name/s#.*:(.*)#\1#p" user_info.txt)
[ "$input_pass" == "$user_passwd" ] && echo "登录成功" || echo "密码不正确"
3.数字判断
作用:
判断数字是否大于小于等于
参数:
参数 | 说明 | 举例 |
---|---|---|
-eq | 等于则条件为真 equal | [ 1 -eq 10 ] |
-ne | 不等于则条件为整 not equal | [ 1 -ne 10 ] |
-gt | 大于则条件为真 greater than | [ 1 -gt 10 ] |
-lt | 小于则条件为真 less than | [ 1 -lt 10 ] |
-ge | 大于等于则条件为真 greater equal | [ 1 -ge 10 ] |
-le | 小于等于则条件为真 less equal | [ 1 -le 10 ] |
举例:
#!/bin/bash
read -p "please input num1:" num1
read -p "please input num2:" num2
[ $num1 -eq $num2 ] && echo "-eq ok" || echo "-eq no"
[ $num1 -ne $num2 ] && echo "-ne ok" || echo "-ne no"
[ $num1 -gt $num2 ] && echo "-gt ok" || echo "-gt no"
[ $num1 -lt $num2 ] && echo "-lt ok" || echo "-lt no"
[ $num1 -ge $num2 ] && echo "-ge ok" || echo "-ge no"
[ $num1 -le $num2 ] && echo "-le ok" || echo "-le no"
文件 -e -f -d
字符串 == != -n -z
数字 -eq -ne -gt -lt
4. 多个条件判断
参数 | 说明 | 举例 |
---|---|---|
-a | 左右两边的条件同时为真才为真 | [ 1 -eq 1 -a 2 -gt 1 ] |
-o | 左右两边的条件有一个为假则为假 | [ 1 -eq 1 -o 2 -gt 2 ] |
2. if单分支
1.语法
写法1:
if [ 条件判断 ]
then
判断为真,执行这里的代码
else
判断为假,执行这里的代码
fi
写法2:
if [ 条件判断 ];then
判断为真,执行这里的代码
else
判断为假,执行这里的代码
fi
2.练习题
题目1:判断两个数字是否相等
#!/bin/bash
if [ "$1" -eq "$2" ];then
echo "相等"
else
echo "不等于"
fi
题目2:判断用户输入的是否为两个参数
#!/bin/bash
if [ "$#" -eq 2 ];then
echo "ok"
else
echo "just 2"
fi
题目3:查看磁盘/当前使用状态,如果使用率超过8%则将当前的时间和磁盘使用容量写入到日志里
/tmp/disk.log
格式如下:
时间:20xxx
磁盘使用量:10%
思路:
第一步:取磁盘使用率的命令是啥
df /|awk 'NR==2{print $5}'|grep -o '[0-9]'
第二步:判断数字是否大于8
if [ 10 -gt 8 ];then
echo ok
else
echo no
fi
第三步:整合
disk=$(df /|awk 'NR==2{print $5}'|grep -o '[0-9]')
if [ $disk -gt 8 ];then
echo "超过了8% 当前为:${disk}%"
else
echo "一切ok"
fi
第四步:加入时间
#!/bin/bash
now=$(date +%F-%H:%M)
disk=$(df /|awk 'NR==2{print $5}'|grep -o '[0-9]')
if [ $disk -gt 8 ];then
echo "时间:$now" >> /tmp/disk.log
echo "当前使用量为:${disk}%" >> /tmp/disk.log
else
echo "一切ok"
fi
题目4:编写一个用来检查用户的uid和gid是否一致的脚本
需求:
1.使用交互式接收用户输入的用户名作为参数
2.判断用户输入的是否为空,如果为空则提醒然后退出
3.如果用户不存在,就输出提醒然后退出脚本
4.如果用户存在,判断这个用户的uid和gid是否一致
5.如果uid和gid一致,则输出正确信息,如果不一致则输出uid和gid不一致
#!/bin/bash
read -p "请输入要查询的用户名:" input_name
check_user=$(grep "^${input_name}:" /etc/passwd|wc -l)
uid=$(awk -F":" "/^${input_name}/"'{print $3}' /etc/passwd)
gid=$(awk -F":" "/^${input_name}/"'{print $4}' /etc/passwd)
if [ -z $input_name ];then
echo "用户名不能为空"
exit
fi
if [ $check_user -eq 0 ];then
echo "用户不存在"
exit
fi
if [ $uid -eq $gid ];then
echo "用户$input_name的uid和gid一致"
echo "uid:$uid gid:$gid"
else
echo "用户$input_name的uid和gid不一致"
echo "uid:$uid gid:$gid"
fi
题目5: 判断输入的数字是否为整数方法
1 包含了字母,输出1
0 纯数字,输出0
echo "123"|grep "[^0-9]"|wc -l
echo "123abc"|grep "[^0-9]"|wc -l
题目6:nginx日志切割
需求:
每天将nginx日志重命名 access.log --> access_2021-12-15.log
#!/bin/bash
now=$(date +%F)
cd /var/log/nginx/
mv access.log access_${now}.log
systemctl reload nginx
if [ $? -eq 0 ];then
echo "日志切割成功"
else
echo "nginx启动失败"
fi
3. if多分支
1.语法
写法1:
if [ 条件判断 ]
then
执行代码
elif [ 条件判断 ]
执行代码
else
执行代码
fi
if [ 你是男孩子嘛 ]
then
我是男孩子
elif [ 你是女孩子嘛 ]
我是女孩子
else
我可能是ykh
fi
举例:
read -p "请输入要查询的用户名:" input_name
check_user=$(grep "^${input_name}:" /etc/passwd|wc -l)
uid=$(awk -F":" "/^${input_name}/"'{print $3}' /etc/passwd)
gid=$(awk -F":" "/^${input_name}/"'{print $4}' /etc/passwd)
if [ -z $input_name ];then
echo "用户名不能为空"
exit
elif [ $check_user -eq 0 ];then
echo "用户不存在"
exit
elif [ $uid -eq $gid ];then
echo "用户$input_name的uid和gid一致"
echo "uid:$uid gid:$gid"
else
echo "用户$input_name的uid和gid不一致"
echo "uid:$uid gid:$gid"
fi
2. 练习题
题目1:成绩查询
提醒用户输入自己的成绩:
1.如果分数大于0小于59则提示需要补考
2.如果分数大于60小于85则提示成绩良好
3.如果分数大于86小于100提示成绩优秀
#!/bin/bash
read -p "请输入查询成绩:" input_num
check_num=$(echo "$input_num"|grep "[^0-9]"|wc -l)
if [ -z "$input_num" ];then
echo "不能输入空"
exit
elif [ "$check_num" -eq 1 ];then
echo "请输入整数"
exit
elif [ "$input_num" -ge 0 ] && [ "$input_num" -le 59 ];then
echo "需要补考"
elif [ "$input_num" -ge 60 ] && [ "$input_num" -le 85 ];then
echo "还凑合"
elif [ "$input_num" -ge 86 ] && [ "$input_num" -le 100 ];then
echo "优秀"
else
echo "我服了"
fi
题目2:nginx启动菜单
需求:
1.)打印以下菜单:
1.重载
2.重启
3.启动
4.停止
请选择你需要的操作:
2.)用户选择相应数字执行操作命令
1.重载
systemctl reload nginx
2.重启
systemctl restart nginx
3.启动
systemctl start nginx
4.停止
systemctl stop nginx
3.)如果输入的不是1234就提醒用户只能输入1234
分解:
第一步:打印菜单
echo "1.重载"
echo "2.重启"
echo "3.启动"
echo "4.停止"
read -p "请选择你需要的操作:" num
----------------------------------------
echo "
1.重载
2.重启
3.启动
4.停止"
read -p "请选择你需要的操作:" num
-----------------------------------------
echo -e "1.重载\n2.重启\n3.启动\n4.停止"
read -p "请选择你需要的操作:" num
-----------------------------------------
read -p "
1.重载
2.重启
3.启动
4.停止
请选择你需要的操作:" num
第二步:用户选择相应数字执行操作命令
if [ "$num" -eq 1 ];then
systemctl reload nginx
elif [ "$num" -eq 2 ];then
systemctl restart nginx
elif [ "$num" -eq 3 ];then
systemctl start nginx
elif [ "$num" -eq 4 ];then
systemctl stop nginx
else
echo "just 1234"
fi
第三步:整合
#!/bin/bash
read -p "
1.重载
2.重启
3.启动
4.停止
请选择你需要的操作:" num
if [ "$num" -eq 1 ];then
systemctl reload nginx
elif [ "$num" -eq 2 ];then
systemctl restart nginx
elif [ "$num" -eq 3 ];then
systemctl start nginx
elif [ "$num" -eq 4 ];then
systemctl stop nginx
else
echo "just 1234"
fi
第四步:完善
#!/bin/bash
. /etc/init.d/functions #娱乐专用
read -p "
1.重载
2.重启
3.启动
4.停止
请选择你需要的操作:" num
if [ "$num" -eq 1 ];then
systemctl reload nginx
if [ $? -eq 0 ];then
action 停止成功 /bin/true
else
action 停止失败 /bin/false
fi
elif [ "$num" -eq 2 ];then
systemctl restart nginx
if [ $? -eq 0 ];then
action "重启成功" /bin/true
else
action "重启失败" /bin/false
fi
elif [ "$num" -eq 3 ];then
systemctl start nginx
if [ $? -eq 0 ];then
action "启动成功" /bin/true
else
action "启动失败" /bin/false
fi
elif [ "$num" -eq 4 ];then
systemctl stop nginx
if [ $? -eq 0 ];then
action "停止成功" /bin/true
else
action "停止失败" /bin/false
fi
else
echo "just 1234"
fi
娱乐一下:
#!/bin/bash
. /etc/init.d/functions
action 安装中... /bin/true
sleep 3
action 安装成功 /bin/true
systemctl start nginx
sleep 1
action 启动成功 /bin/true
systemctl restart nginx
sleep 1
action 重启成功 /bin/true
systemctl reload nginx
sleep 1
action 重载成功 /bin/true
systemctl stop nginx
sleep 1
action 停止成功 /bin/true