首页 > 系统相关 >shell判断和流程控制

shell判断和流程控制

时间:2023-06-19 11:12:55浏览次数:46  
标签:shell num 流程 echo nginx 判断 && input eq

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

标签:shell,num,流程,echo,nginx,判断,&&,input,eq
From: https://www.cnblogs.com/KennethLin/p/17490612.html

相关文章

  • 聊城申请商标的流程步骤是什么
    聊城申请商标的流程步骤是什么 恒标知产刘经理 (一)准备申请书件 1、应提交的申请书件为: (1)《商标续展注册申请书》 (2)申请人经盖章或者签字确认的主体资格zm文件复印件 (3)委托代理的提交《代理委托书》,直接在商标注册大厅办理的提交经办人的及复印件(原件经比对后退还) (4)注册证复......
  • Java判断null的几种方式
    组内codereview时,有同学提到字符串判断空值的写法,如下两种,(1)null在后,@TestpublicvoidtestDemo1(){Stringstr=null;if(str==null){System.out.println("null在后");return;}}(2)null在前,@TestpublicvoidtestDemo2(){Stringstr=null;if(n......
  • shell 登录linux服务器并执行命令
    注意里边(eeooff区域)不能定义变量#!/bin/bashscpdist.zipm-p:/data/wwwroot/medical-shop-websshm-p>/dev/null2>&1<<eeooffcd/data/wwwrootrm-rfdist_bakmvdistdist_bakunzipdist.zipexiteeooffechodone!进入容器操作不能用次方法,应该用docker......
  • 测试接口文档流程
    安装jmeterwindows批处理jmeter启动(双击)获取tokenappKey=6773dfd985c249a69916445137fb46c8appSecret=151a36625370491e9e6ee2721a2fc664jmeter工具弃用,改为使用postman工具::::::@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@快速查看本机公网IP地址真香IT于2022-04......
  • springboot启动流程 (2) 组件扫描
    SpringBoot的组件扫描是基于Spring@ComponentScan注解实现的,该注解使用basePackages和basePackageClasses配置扫描的包,如果未配置这两个参数,Spring将扫描该配置类所属包下面的组件。在服务启动时,将使用ConfigurationClassPostProcessor扫描当前所有的BeanDefinition,解析Configur......
  • 华为流程体系:IPD流程框架(限制版)
    目录前言详细内容专栏列表前言今天主要来谈谈IPD体系的主体框架所涉及的一些相关内容。其实关于IPD体系,我在之前的文章或课程中都有过不同程度的讲解。但是,由于这个体系所涉及的面是非常广泛的。这个时候就必须通过一系列的延伸内容从不同的维度来分析和讲解。只有通过这种方式......
  • Shell脚本_统计当前shell脚本已经运行了几分几秒
    可以使用date命令获取当前时间,再与脚本开始运行的时间进行计算,最后将计算结果转换为分钟和秒数。示例代码:#!/bin/bash#记录脚本开始运行的时间start_time=$(date+%s)#执行脚本的主体代码sleep5#计算脚本已经运行的时间end_time=$(date+%s)elapsed_time=$((end_time......
  • linux shell 编程比较详解
    shell编程字符串比较shell中整数比较和字符串比较方法,如等于,不等于,大于,大于等于,小于,小于等于等。1、整数比较-eq等于,如if["$a"-eq"$b"]-ne不等于,如if["$a"-ne"$b"]-gt大于,如if["$a"-gt"$b"]-ge大于等于,如if["$a"-ge"......
  • shell的date的部分处理--需要记住..
    在Linux中,可以使用date命令获取日期,date获取当前完整日期date--date="3daysago"获取3天前的完整日期date--date="3daysago"+%Y%m%d  获取3天前的年月日;在date命令中,可以用%指定要显示内容,显示结果为如下形式:20120429......
  • shell启停脚本
    #!/usr/bin/envbash#获取服务目录xxx_dir=$(cd$(dirname"${BASH_SOURCE[0]}")&&pwd)#端口检测间隔w_interval=3#启动后端口检测次数max_retried_times=50REDIS_INSTALL_DIR=/bin/REDIS_CONFIG_FILE=/etc/redis/redis.confMONGO_INSTALL_DIR=/usr/MONGO_CON......