前言
无论什么编程语言都离不开条件判断(流控)。SHELL也不例外。
例如,用户输入的密码不够长时提示用户,你太短了
例如,用户输入了备份的目录,如果有目录继续备份,如果没有目录创建目录。
例如,用户输入成绩,如果100-80分评为优秀,如果60-79分评为合格,如果59-0分评为不合格。
Shell 条件测试
数值比较 [ 整数1 操作符 整数2 ]
- 操作符
- [ 20 -gt 10 ] 大于
- [ 1 -lt 10 ] 小于
- [ 1 -eq 1 ] 等于
- [ 1 -ne 10 ] 不等于
- [ 20 -ge 10 ] 大于等于
- [ 10 -le 10 ] 小于等于
- 示例
- 需求:
- 猜测用户输入的密码,是否满足长度需求
- 变量长度:echo ${#pass}
- 测试语法:
- 格式1: test 条件表达式
- 格式2: [ 条件表达式 ]
- 格式3: [[ 条件表达式 ]]
- if语法结构
- read -p "请输入您的密码:" ps
- if [ ${#ps} -lt 7 ];then
- echo "您的密码太短!"
- else
- echo "您的密码真长!"
- fi
- 测试
- [root@localhost ~]# bash pass1.sh
- 请输入您的密码:123
- 您的密码太短!
- [root@localhost ~]# bash pass1.sh
- 请输入您的密码:1234
- 您的密码太短!
- [root@localhost ~]# bash pass1.sh
- 请输入您的密码:123456
- 您的密码太短!
- [root@localhost ~]# bash pass1.sh
- 请输入您的密码:1234567
- 您的密码真长!
复制代码 文件测试 [ 操作符 文件或目录 ]
- 操作符(了解)
- -f filename : 当filename 存在时返回真
- -b filename : 当filename 存在并且是块文件时返回真(返回0)
- -d pathname : 当pathname 存在并且是一个目录时返回真
- -h filename : 当filename 存在并且是符号链接文件时返回真 (或 -L filename)
- -c filename : 当filename 存在并且是字符文件时返回真
- -e pathname : 当由pathname 指定的文件或目录存在时返回真
- -g pathname : 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
- -k pathname : 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真
- -p filename : 当filename 存在并且是命名管道时返回真
- -r pathname : 当由pathname 指定的文件或目录存在并且可读时返回真
- -s filename : 当filename 存在并且文件大小大于0 时返回真
- -S filename : 当filename 存在并且是socket 时返回真
- -t fd: 当fd 是与终端设备相关联的文件描述符时返回真
- -w pathname : 当由pathname 指定的文件或目录存在并且可写时返回真
- -x pathname : 当由pathname 指定的文件或目录存在并且可执行时返回真
- -O pathname : 当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
- -G pathname : 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真
复制代码 需求:
请用户输入备份的路径,如果存在提示已存在可以备份,如果不存在提示目录不存在请创建。- 脚本
- #!/bin/bash
- read -p "请输入您要备份的目录:" cata
- if [ -d $cata ];then
- echo "$cata已存在可以备份"
- else
- echo "${cata}不存在无法创建"
- fi
- [root@bogon ~]# sh catalogue.sh
- 请输入您要备份的目录:ccc
- ccc不存在无法创建
- [root@bogon ~]# mkdir /soft
- [root@bogon ~]# sh catalogue.sh
- 请输入您要备份的目录:/soft
- /soft已存在可以备份
复制代码 字符串比较 [ "字符串" = "字符串" ]
=,等于
需求
邀请用户确认,yes升级,否则不升级- 脚本
- #!/bin/bash
- read -p "您确定要升级吗:" tt
- if [ ${tt} = "yes" ];then
- echo "正在升级"
- else
- echo "您不升级"
- fi
- [root@bogon ~]# sh zifu.sh
- 您确定要升级吗:yes
- 正在升级
- [root@bogon ~]# sh zifu.sh
- 您确定要升级吗:no
- [root@bogon ~]# 您不升级
复制代码 !=,不等于
注意叹号和等号间没有空格- 脚本
- #!/bin/bash
- read -p "您确定要升级吗:" tt
- if [ ${tt} != "yes" ];then
- echo "正在升级"
- else
- echo "您不升级"
- fi
- [root@bogon ~]# sh zifu.sh
- 您确定要升级吗:yes
- 您不升级
- [root@bogon ~]# sh zifu.sh
- 您确定要升级吗:no
- 正在升级
复制代码 发现正好和上面相反
-z:判断字符长度是为0(了解)
-n: 判断字符长度不是为0
双引号的重要性,解决一元表达式的问题- 双引号的重要性,解决一元表达式的问题
- [root@localhost ~]# BBB=""
- [root@localhost ~]# echo ${#BBB}
- 0
- [root@localhost ~]# [ -z "$BBB" ] 字符长度是为0
- [root@localhost ~]# echo $?
- 0
- [root@localhost ~]# [ -n "$BBB" ] 字符长度不为0
- [root@localhost ~]# echo $?
- 1
复制代码 and和or
简介
当条件测试比较复杂时,需要多个条件同时成立。就需要混合条件测试了。
逻辑的(and)与(or):&& 逻辑的 AND 的意思, -a ,两个条件同时成立,为真。
|| 逻辑的 OR 的意思, -o ,两个条件一个成立,为真。
事例
猜测用户输入的密码是否满足如下条件
1.长度大于等于7位
2.包含字母大写
3.包含字母小写
4.包含符号“@!_”- 脚本
- read -p "请输入您的密码:" password
- if [ ${#password} -gt 7 ] && [[ ${password} =~ [a-z] ]] && [[ ${password} =~ [A-Z] ]] && [[ ${password} =~ [@_!] ]];then
- echo "您的密码真的复杂"
- else
- echo “您的密码太简单了”
- fi
- [root@bogon ~]# sh andor.sh
- 请输入您的密码:12345aZ!
- 您的密码真的复杂
- [root@bogon ~]# sh andor.sh
- 请输入您的密码:123245
- “您的密码太简单了”
复制代码 多种表达方法(了解)
[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
单分支结构
语法- if [ command/test ];then
- 符合该条件执行的语句
- fi
复制代码 需求
编写脚本,由用户输入用户名,如果用户不存在,则创建该用户
了解一下$?变量
上个命令的退出状态,或函数的返回值- #!/bin/bash
- read -p "请输入要创建的用户名称:" name
- id $name &> /dev/null
- if [ $? -ne 0 ];then
- useradd $name
- fi
- [root@bogon ~]# sh create
- 请输入要创建的用户名称:cccc
- [root@bogon ~]# id cccc
- uid=1025(cccc) gid=1025(cccc) 组=1025(cccc)
复制代码 双分支结构
- 语法
- if 条件测试
- then
- 命令序列
- else
- 命令序列
- fi
复制代码 需求
编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456;否则,提示用户已经存在- 脚本
- #!/bin/bash
- read -p "请输入要创建的用户名称:" name
- if id $name &> /dev/null; then
- echo "${name}用户已经存在"
- else
- useradd ${name}
- echo "123456" | passwd --stdin $name &> /dev/null
- echo "$name用户创建成功密码是123456"
- fi
- [root@bogon ~]# sh user.sh
- 请输入要创建的用户名称:rrr
- rrr用户创建成功密码是123456
- [root@bogon ~]# sh user.sh
- 请输入要创建的用户名称:rrr
- rrr用户已经存在
复制代码 多分支结构
语法- 多分支结构
- if 条件测试1
- then 命令序列
- elif 条件测试2
- then 命令序列
- elif 条件测试3
- then 命令序列...
- else 命令序列
- fi
复制代码 需求
编写脚本,取出系统时间的小时,对数字进行判断
6--10 this is morning
11-13 this is noon
14-18 this is afternoon
其他 this is night - 脚本
- #!/bin/bash
- hour=`date +%H`
- if [ $hour -ge 6 -a $hour -le 10 ];then
- echo "this is morning"
- elif [ $hour -ge 11 -a $hour -le 13 ];then
- echo "this is noon"
- elif [ $hour -ge 14 -a $hour -le 18 ];then
- echo "this is afternoon"
- else
- echo "this is night"
- fi
- [root@bogon ~]# sh date.sh
- this is afternoon
- [root@bogon ~]# date
- 2022年 08月 24日 星期三 16:59:30 CST
- [root@bogon ~]# date -s 10:10:06
- 2022年 08月 24日 星期三 10:10:06 CST
- [root@bogon ~]# sh date.sh
- this is morning
复制代码 嵌套结构(了解)
语法- 嵌套结构
- if 条件测试1 then 命令序列
- if 条件测试1 then 命令序列
- else 命令序列
- fi
-
- else 命令序列
- fi
复制代码 需求

如图所示:创建用户,如果不存在则创建用户提示用户输入密码,密码大于7位则创用户,密码小于七位提示密码不符合要求。如果用户已经存在,提示存在即可!- 脚本
- #!/bin/bash
- read -p "请输入要创建用户名称:" name
- id ${name} &> /dev/null
- if [ $? -eq 0 ];then
- echo "${name}已存在"
- else
- useradd ${name}
- echo "$name创建完成:"
- read -p "请输入用户密码" password
- if [ ${password} -ge 7 ];then
- echo ${password} | passwd --stdin $name
- echo "$name用户密码是${password}"
- else
- echo "密码不符合要求"
- fi
- fi
- [root@bogon ~]# sh name.sh
- 请输入要创建用户名称:kkk
- kkk创建完成:
- 请输入用户密码123456
- 更改用户 kkk 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- kkk用户密码是123456
- [root@bogon ~]# sh name.sh
- 请输入要创建用户名称:kkk
- kkk已存在
复制代码 调试脚本
调试脚本的其他方法:
- # sh -n 02.sh 仅调试脚本中的语法错误。
- # sh -vx 02.sh 以调试的方式执行,查询整个执行过程
复制代码 注意
1、[ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和前面']都必须要有空格
2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错
4、判断是不支持浮点值的
5、如果只单独使用>或者 |