Shell 第二章《流控》

打印 上一主题 下一主题

主题 880|帖子 880|积分 2640

前言

无论什么编程语言都离不开条件判断(流控)。SHELL也不例外。
例如,用户输入的密码不够长时提示用户,你太短了
例如,用户输入了备份的目录,如果有目录继续备份,如果没有目录创建目录。
例如,用户输入成绩,如果100-80分评为优秀,如果60-79分评为合格,如果59-0分评为不合格。
Shell 条件测试

数值比较 [ 整数1 操作符 整数2 ]
 

  1. 操作符
  2. [     20 -gt 10     ] 大于
  3. [     1 -lt 10      ] 小于
  4. [     1 -eq 1       ] 等于
  5. [     1 -ne 10      ] 不等于
  6. [     20 -ge 10     ] 大于等于
  7. [     10 -le 10     ] 小于等于
  8. 示例
  9. 需求:
  10. 猜测用户输入的密码,是否满足长度需求
  11. 变量长度:echo  ${#pass}
  12. 测试语法:
  13.        格式1: test 条件表达式
  14.        格式2: [ 条件表达式 ]
  15.        格式3: [[ 条件表达式 ]]
  16. if语法结构
  17. read   -p "请输入您的密码:" ps
  18. if  [ ${#ps} -lt 7 ];then
  19. echo "您的密码太短!"
  20. else
  21. echo "您的密码真长!"
  22. fi
  23. 测试
  24. [root@localhost ~]# bash pass1.sh
  25. 请输入您的密码:123
  26. 您的密码太短!
  27. [root@localhost ~]# bash pass1.sh
  28. 请输入您的密码:1234
  29. 您的密码太短!
  30. [root@localhost ~]# bash pass1.sh
  31. 请输入您的密码:123456
  32. 您的密码太短!
  33. [root@localhost ~]# bash pass1.sh
  34. 请输入您的密码:1234567
  35. 您的密码真长!
复制代码
文件测试 [ 操作符 文件或目录 ]
  1. 操作符(了解)
  2. -f filename : 当filename 存在时返回真
  3. -b filename : 当filename 存在并且是块文件时返回真(返回0)
  4. -d pathname : 当pathname 存在并且是一个目录时返回真
  5. -h filename : 当filename 存在并且是符号链接文件时返回真 (或 -L filename)
  6. -c filename : 当filename 存在并且是字符文件时返回真
  7. -e pathname : 当由pathname 指定的文件或目录存在时返回真
  8. -g pathname : 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
  9. -k pathname : 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真
  10. -p filename : 当filename 存在并且是命名管道时返回真
  11. -r pathname : 当由pathname 指定的文件或目录存在并且可读时返回真
  12. -s filename : 当filename 存在并且文件大小大于0 时返回真
  13. -S filename : 当filename 存在并且是socket 时返回真
  14. -t fd: 当fd 是与终端设备相关联的文件描述符时返回真
  15. -w pathname : 当由pathname 指定的文件或目录存在并且可写时返回真
  16. -x pathname : 当由pathname 指定的文件或目录存在并且可执行时返回真
  17. -O pathname : 当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
  18. -G pathname : 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真
复制代码
需求:
请用户输入备份的路径,如果存在提示已存在可以备份,如果不存在提示目录不存在请创建。
  1. 脚本
  2. #!/bin/bash
  3. read -p "请输入您要备份的目录:" cata
  4. if [ -d $cata ];then
  5. echo "$cata已存在可以备份"
  6. else
  7. echo "${cata}不存在无法创建"
  8. fi
  9. [root@bogon ~]# sh catalogue.sh
  10. 请输入您要备份的目录:ccc
  11. ccc不存在无法创建
  12. [root@bogon ~]# mkdir /soft
  13. [root@bogon ~]# sh catalogue.sh
  14. 请输入您要备份的目录:/soft
  15. /soft已存在可以备份
复制代码
字符串比较 [ "字符串" = "字符串" ]

=,等于
需求
邀请用户确认,yes升级,否则不升级
  1. 脚本
  2. #!/bin/bash
  3. read -p "您确定要升级吗:" tt
  4. if [ ${tt} = "yes" ];then
  5. echo "正在升级"
  6. else
  7. echo "您不升级"
  8. fi
  9. [root@bogon ~]# sh zifu.sh
  10. 您确定要升级吗:yes
  11. 正在升级
  12. [root@bogon ~]# sh zifu.sh
  13. 您确定要升级吗:no
  14. [root@bogon ~]# 您不升级
复制代码
!=,不等于
注意叹号和等号间没有空格
  1. 脚本
  2. #!/bin/bash
  3. read -p "您确定要升级吗:" tt
  4. if [ ${tt} != "yes" ];then
  5. echo "正在升级"
  6. else
  7. echo "您不升级"
  8. fi
  9. [root@bogon ~]# sh zifu.sh
  10. 您确定要升级吗:yes
  11. 您不升级
  12. [root@bogon ~]# sh zifu.sh
  13. 您确定要升级吗:no
  14. 正在升级
复制代码
发现正好和上面相反
-z:判断字符长度是为0(了解)
-n: 判断字符长度不是为0
双引号的重要性,解决一元表达式的问题
  1. 双引号的重要性,解决一元表达式的问题
  2. [root@localhost ~]# BBB=""
  3. [root@localhost ~]# echo ${#BBB}
  4. 0
  5. [root@localhost ~]# [ -z "$BBB" ] 字符长度是为0
  6. [root@localhost ~]# echo $?
  7. 0
  8. [root@localhost ~]# [ -n "$BBB" ] 字符长度不为0
  9. [root@localhost ~]# echo $?
  10. 1
复制代码
and和or

简介
当条件测试比较复杂时,需要多个条件同时成立。就需要混合条件测试了。
逻辑的(and)与(or):&&   逻辑的 AND 的意思, -a ,两个条件同时成立,为真。
                           ||  逻辑的 OR 的意思, -o ,两个条件一个成立,为真。
事例
猜测用户输入的密码是否满足如下条件
1.长度大于等于7位
2.包含字母大写
3.包含字母小写
4.包含符号“@!_”
  1. 脚本
  2. read -p "请输入您的密码:" password
  3. if [ ${#password} -gt 7 ] && [[ ${password} =~ [a-z] ]] && [[ ${password} =~ [A-Z] ]] && [[ ${password} =~ [@_!] ]];then
  4. echo "您的密码真的复杂"
  5. else
  6. echo “您的密码太简单了”
  7. fi
  8. [root@bogon ~]# sh andor.sh
  9. 请输入您的密码:12345aZ!
  10. 您的密码真的复杂
  11. [root@bogon ~]# sh andor.sh
  12. 请输入您的密码:123245
  13. “您的密码太简单了”
复制代码
多种表达方法(了解)
[root@localhost ~]# [ 1 -lt 2 -a 5 -gt 10 ]
[root@localhost ~]# [ 1 -lt 2 -o 5 -gt 10 ]
[root@localhost ~]# [[ 1 -lt 2 && 5 -gt 10 ]]
[root@localhost ~]# [[ 1 -lt 2 || 5 -gt 10 ]]
[root@localhost ~]# [ 1 -lt 2 ] && [ 11 -gt 10 ]
流程控制 if

单分支结构

语法
  1. if [ command/test ];then
  2. 符合该条件执行的语句
  3. fi
复制代码
 需求
编写脚本,由用户输入用户名,如果用户不存在,则创建该用户
了解一下$?变量
上个命令的退出状态,或函数的返回值
  1. #!/bin/bash
  2. read -p "请输入要创建的用户名称:"  name
  3. id $name &> /dev/null
  4. if [ $? -ne 0 ];then
  5. useradd $name
  6. fi
  7. [root@bogon ~]# sh create
  8. 请输入要创建的用户名称:cccc
  9. [root@bogon ~]# id cccc
  10. uid=1025(cccc) gid=1025(cccc) 组=1025(cccc)
复制代码
 双分支结构
  1. 语法
  2. if 条件测试
  3. then 
  4. 命令序列
  5. else 
  6. 命令序列
  7. fi
复制代码
需求
编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456;否则,提示用户已经存在
  1. 脚本
  2. #!/bin/bash
  3. read -p "请输入要创建的用户名称:" name
  4. if id $name &> /dev/null; then
  5.        echo "${name}用户已经存在"
  6. else
  7.        useradd ${name}
  8.        echo "123456" | passwd --stdin $name &> /dev/null
  9.        echo "$name用户创建成功密码是123456"
  10. fi
  11. [root@bogon ~]# sh user.sh
  12. 请输入要创建的用户名称:rrr
  13. rrr用户创建成功密码是123456
  14. [root@bogon ~]# sh user.sh
  15. 请输入要创建的用户名称:rrr
  16. rrr用户已经存在
复制代码
多分支结构

语法
  1. 多分支结构
  2. if 条件测试1
  3. then 命令序列
  4. elif 条件测试2
  5. then 命令序列
  6. elif 条件测试3
  7. then 命令序列...
  8. else 命令序列
  9. fi
复制代码
需求
编写脚本,取出系统时间的小时,对数字进行判断 
6--10  this is morning 
11-13  this is noon 
14-18  this is afternoon 
其他   this is night 
  1. 脚本
  2. #!/bin/bash
  3. hour=`date +%H`
  4. if [ $hour -ge 6 -a $hour -le 10 ];then
  5. echo "this is morning"
  6. elif [ $hour -ge 11 -a $hour -le 13 ];then
  7. echo "this is noon"
  8. elif [ $hour -ge 14 -a $hour -le 18 ];then
  9. echo "this is afternoon"
  10. else
  11. echo "this is night"
  12. fi
  13. [root@bogon ~]# sh date.sh
  14. this is afternoon
  15. [root@bogon ~]# date
  16. 2022年 08月 24日 星期三 16:59:30 CST
  17. [root@bogon ~]# date -s 10:10:06
  18. 2022年 08月 24日 星期三 10:10:06 CST
  19. [root@bogon ~]# sh date.sh
  20. this is morning
复制代码
嵌套结构(了解)
语法
  1. 嵌套结构
  2. if 条件测试1        then 命令序列
  3.         if 条件测试1        then 命令序列
  4.         else 命令序列
  5.         fi
  6.        
  7. else 命令序列
  8. fi
复制代码
需求

如图所示:创建用户,如果不存在则创建用户提示用户输入密码,密码大于7位则创用户,密码小于七位提示密码不符合要求。如果用户已经存在,提示存在即可!
  1. 脚本
  2. #!/bin/bash
  3. read -p "请输入要创建用户名称:" name
  4. id ${name} &> /dev/null
  5. if [ $? -eq 0 ];then
  6. echo "${name}已存在"
  7. else
  8.      useradd ${name}
  9.      echo "$name创建完成:"
  10. read -p "请输入用户密码" password
  11.     if [ ${password} -ge 7 ];then
  12.             echo ${password} | passwd --stdin $name
  13.             echo "$name用户密码是${password}"
  14.       else
  15.             echo "密码不符合要求"
  16.    fi
  17. fi
  18. [root@bogon ~]# sh name.sh
  19. 请输入要创建用户名称:kkk
  20. kkk创建完成:
  21. 请输入用户密码123456
  22. 更改用户 kkk 的密码 。
  23. passwd:所有的身份验证令牌已经成功更新。
  24. kkk用户密码是123456
  25. [root@bogon ~]# sh name.sh
  26. 请输入要创建用户名称:kkk
  27. kkk已存在
复制代码
调试脚本
调试脚本的其他方法:

  1. # sh -n 02.sh 仅调试脚本中的语法错误。
  2. # sh -vx 02.sh 以调试的方式执行,查询整个执行过程
复制代码
注意
1、[ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和前面']都必须要有空格
2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错
4、判断是不支持浮点值的
5、如果只单独使用>或者
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表