kenneth-lin

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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
posted on 2023-06-19 10:59  kenneth-lin  阅读(31)  评论(0编辑  收藏  举报