day64 条件判断的学习
day64 shell关于if的学习
条件判断的语法
# 首先看看优质的脚本是怎么写的。如何的模仿
# 找出系统中自带的shell的脚本
# find / -name "*.sh"
#看看别人是如何定义变量的,参数的使用,使用read的命令
学前的预览
条件的判断
- 我们目前写的shell的脚本都是自上而下的一次的读取命令,且执行
- 但是要控制程序执行的顺序,修改这个顺序,就得对脚本进行逻辑控制。
- 必须对脚本进行条件的判断
注意
语法中,括号,条件测试的符号左右的两边都有空格,千万别漏掉了。

1. 如果你不知道标准的shell脚本该如何写
2. 系统自带的各种shell的脚本

bash /etc/init.d/functions
打开一个子bash,在该子bash的环境中加载该函数所有的变量,
子bash的环境,不会给父bash用。
- 看懂bash的环境概念
- 看懂这个脚本是如何的使用的/
条件测试整体概览
1.基于文件进行条件判断
- 常用参数
- 更多参数
- 结合test命令
- 测试常用条件参数
2.基于整数判断
案例
练习题
3.基于字符串判断
- 系统自带脚本参考
- 练习
- 模拟登陆开发程序
基于文件进行条件的判断
如下的参数,主要是基于文件来判断的
填写文件的路径判断
常用参数
| 参数 | 解释 | 举例 |
|---|---|---|
| -e | 文件或目录存在就是true | [ -e filepath ] |
| -s | 文件存在且只要有一个字母就是true | [ -s filepath ] |
| -f | 文件存在且是普通文件类型就是true | [ -f filepath ] |
| -d | 文件存在且是目录类型就是true | [ -d filepath ] |
| -r | 文件存在且有read权限就是true | [ -r filepath ] |
| -w | 文件存在且有write权限就是true | [ -w filepath ] |
| -x | 文件存在且有x权限就是true | [ -x filepath ] |
基于字符串判断
语法
| 参数 | 解释 | 案例 |
|---|---|---|
| == | 两边值相等为true | [ "$a" == "$b" ] |
| != | 两边值不等为true | [ "$a" != "$b" ] |
| -z | 字符串为空时为true | [ -z "$a" ] |
| -n | 字符串内容不为空为true | [ -n "$a" ] |
| = | 同 == 作用一样 | [ "$a" = "$b" ] |
练习
变量的值
[root@m-61 ~/part3-shell]#s1=77
[root@m-61 ~/part3-shell]#
[root@m-61 ~/part3-shell]#s2=88
[root@m-61 ~/part3-shell]#
[root@m-61 ~/part3-shell]#
[root@m-61 ~/part3-shell]#
[root@m-61 ~/part3-shell]#[ $s1 != $s2 ] && echo yes || echo no
yes
[root@m-61 ~/part3-shell]#
[root@m-61 ~/part3-shell]#
[root@m-61 ~/part3-shell]#[ $s1 = $s2 ] && echo yes || echo no
no
更多的参数
做好笔记,用的时候多看看。
test 命令最短的定义可能是评估一个表达式;如果条件为真,则返回一个 0 值。如果表达式不为真,则返回一个大于 0 的值 — 也可以将其称为假值。检查最后所执行命令的状态的最简便方法是使用 $? 值。
参数:
1. 关于某个文件名的『类型』侦测(存在与否),如 test -e filename
-e 该『文件名』是否存在?(常用)
-f 该『文件名』是否为文件(file)?(常用)
-d 该『文件名』是否为目录(directory)?(常用)
-b 该『文件名』是否为一个 block device 装置?
-c 该『文件名』是否为一个 character device 装置?
-S 该『文件名』是否为一个 Socket 文件?
-p 该『文件名』是否为一个 FIFO (pipe) 文件?
-L 该『文件名』是否为一个连结档?
2. 关于文件的权限侦测,如 test -r filename
-r 侦测该文件名是否具有『可读』的属性?
-w 侦测该文件名是否具有『可写』的属性?
-x 侦测该文件名是否具有『可执行』的属性?
-u 侦测该文件名是否具有『SUID』的属性?
-g 侦测该文件名是否具有『SGID』的属性?
-k 侦测该文件名是否具有『Sticky bit』的属性?
-s 侦测该文件名是否为『非空白文件』?
3. 两个文件之间的比较,如: test file1 -nt file2
-nt (newer than)判断 file1 是否比 file2 新
-ot (older than)判断 file1 是否比 file2 旧
-ef 判断 file2 与 file2 是否为同一文件,可用在判断 hard link 的判定上。 主要意义在判定,两个文件是否均指向同一个 inode 哩!
4. 关于两个整数之间的判定,例如 test n1 -eq n2
-eq 两数值相等 (equal)
-ne 两数值不等 (not equal)
-gt n1 大于 n2 (greater than)
-lt n1 小于 n2 (less than)
-ge n1 大于等于 n2 (greater than or equal)
-le n1 小于等于 n2 (less than or equal)
5. 判定字符串的数据
test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为 true
test -n string 判定字符串是否非为 0 ?若 string 为空字符串,则为 false。
注: -n 亦可省略
test str1 = str2 判定 str1 是否等于 str2 ,若相等,则回传 true
test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false
6. 多重条件判定,例如: test -r filename -a -x filename
-a (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。
-o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。
! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true
结合test命令
条件判断的用法,有两种的语法的形式
1. 中括号
# 前面是条件判断的语句,得到true或者是false的结果,后面可以加上命令的具体的操作
[-f /etc/hosts ] && cat /etc/hosts
2. test命令
test -f /etc/hosts && cat /etc/hosts

test -f
[ 条件的测试 ]
都是常见的用法。看懂会用即可。
看脚本,阅读他人优秀的代码,也是镇长编程见识的方案之一
测试常用条件参数
1. 具体使用场景,例如 ansible的配置的文件。
2. 脚本开发,逻辑,加一条,例如主机清单文件不存在,ansible 则不执行。
3。 理解该使用场景的条件的测试。
具体使用场景,例如 ansible的配置文件
[root@m-61 ~]#
[root@m-61 ~]#[ -f /etc/ansible/hosts ] && ansible all -m ping ^C
[root@m-61 ~]#
[root@m-61 ~]#
[root@m-61 ~]## 脚本开发,逻辑,加一条,例如主机清单文件不存在,ansible则不该执行
[root@m-61 ~]#
[root@m-61 ~]#[ -f /etc/ansible/hosts ] && ansible all -m ping ^C
[root@m-61 ~]#
[root@m-61 ~]#
[root@m-61 ~]#mv /etc/ansible/ansible.cfg{,.bak} ^C
[root@m-61 ~]#
[root@m-61 ~]#
[root@m-61 ~]#
[root@m-61 ~]#mv /etc/ansible/hosts{,.bak}
[root@m-61 ~]#
[root@m-61 ~]#
[root@m-61 ~]#[ -f /etc/ansible/hosts ] && ansible all -m ping # yes or no?
[root@m-61 ~]#
[root@m-61 ~]#
[root@m-61 ~]## 理解该使用场景的条件测试,刷3333
基于整数判断
条件语句
-eq 两数值相等 (equal)
-ne 两数值不等 (not equal)
-gt n1 大于 n2 (greater than)
-lt n1 小于 n2 (less than)
-ge n1 大于等于 n2 (greater than or equal)
-le n1 小于等于 n2 (less than or equal)
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 小于
-le 小于或者等于
案例
猜数字比大小
首先这种的脚本,都可以用read交互式接收数据,和位置参数接收数据,两种角度去开发
系统中,生成一个数字
1. 程序让你输入与一个数字
程序根据输入和 数字进行比大小比对,做不同的逻辑的判断。
#!/bin/bash
#结果
result=66
# 用户输入数据
read -p "please input your number:" num
# 条件大小的比对
# 首先,会有几种的条件,大于,小于,多少的条件,对应了多少的代码。
# if基础语法
if [ 条件1 ];then
成立执行 1
elif [ 条件2 ];then
成立执行 2
elif [ 条件3 ];then
成立执行 3
else
隐藏条件,无须写了,直接进入这里执行代码
fi
具体的代码
#!/bin/bash
# 结果
result=66
# 用户输入的数据
read -p "please input your num :" num
#猜大了
if [ $num -gt $result ];then
echo "猜大了"
elif [ $num -lt $result ];then
echo "猜小了"
#等于
else
echo “恭喜你猜对了”
fi
这里是最基本的判断,完成3个判断,学会分析,如何的定义定义多少个条件。
以及条件要做什么事。
该脚本需要优化的地方很多,后面会给你机会写出完善的猜数字脚本

先把简单,先简单的玩懂,关于数字的条件判断即可。
比较数字大小,美化结果
学习,导入系统中的一个函数,里面有结果美化的程序
#!/bin/bash
# 加载系统的,提供颜色结果的函数库。
. /etc/init.d/functions
# 语法是
# action "你的字符串" /bin/true
# action "你的字符串" /bin/false
result=66
# 用户输入数据
read -p "please input your num:" num
# 猜大了
if [ $num -gt $result ];then
action "猜大了!!" /bin/false
# 猜小了
elif [ $num -lt $result ];then
action "猜小了" /bin/false
# 等于
else
action "恭喜你,猜对了~~~~" /bin/true
fi
小结
1. 学习条件测试的几大类,文件测试,文字的测试,字符串测试,参数的不同
2. 拆数字小脚本的开发,以及优化的思路的讲解
3. 美化程序结果 , 加载系统库。
对于刚才猜数字程序优化的思路

思路:如何处理这个num数据,判断是纯数字(shell这里输入的数字,也是当作字符串处理)
1.利用正则表达式,利用三剑客,对数据进行校验如:
grep
sed
awk
正则的方式写的方法很多
N种的需求,解决这个需求,
对于猜数字程序的优化的思路
判断用户输入的是否是整数
#!/bin/bash
#加载系统的,提供颜色结果的数据库
. /etc/init.d/functions
#语法是
# cation "你的字符串“ /bin/true
# cation "你的字符串" /bin/false
resuklt=66
# 用户输入的数据
read -p "please input your name :" num
#对输入进行数字校验,只有纯数字,整数,才符合这个计算器的逻辑
check_res=$(echo $num|grep -E '[^0-9]+'|wc -l)
#判断这个结果非0就退出脚本
[ $check_res -ne 0 ] && echo "请输入整数,1-99" && exit
# 大了
if [ $num -gt $result ];then
action "猜大了" /bin/false
elif [ $num -lt $result ];then
action "小了" /bin/false
else
action "猜对了" /bin/true
fi
判断用户的密码是否符合6位数
在各种的游戏种密码最少是6位数字
练习对整数变量的判断
思路是,对于用户输入的密码和字符串,字符的个数进行判断
#!/bin/bash
# 基于位置参数,传入密码
echo "输入你的密码 $1"
# 进行判断如果不是6位的话,重新的输入
# 用-eq 表示,密码正好是6位数,因此后面这个 || 的条件就不执行了
# 当A条件失败的时候 || 才执行B的命令
# 当A条件成立的时候 && B的命令才能执行
# 判断用户输入的正好是 -eq 等于 6因此后面就不执行了。
[ $1 -eq 6 ] || echo ”二级密码必须是6位,请重新的输入“
[ $1 -ne 6 ] && echo "二级密码必须是6位"
具体的代码
#!/bin/bash
echo "您输入的二级密码是:$1"
# 如何判断用户输入的数据字符个数呢?
# 方案1,利用wc -L 参数
len_vars=$(echo $1|wc -L)
# 如果不等于6 就报错
[ $len_vars -ne 6 ] && echo "密码必须是6位!!重新输入" && exit
# 后续的逻辑就不该执行了
echo "只有你输入正确的6位密码,才能看到我"
# 方案二、利用变量子串功能,统计变量值的长度(高级玩法,以后再说)
# 语法是 ${#变量名}
#!/bin/bash
echo "您输入的二级密码是:$1"
# 如何判断用户输入的数据字符个数呢?
# 方案1,利用wc -L 参数
len_vars=$(echo $1|wc -L)
# 如果不等于6 就报错
# 方案1,利用wc -L 作用统计字符个数
#[ $len_vars -ne 6 ] && echo "密码必须是6位!!重新输入" && exit
# 方案2,利用变量子串统计字符个数
[ ${#1} -ne 6 ] && echo "密码必须是6位!!重新输入" && exit
# 后续的逻辑就不该执行了
echo "~~~~~~只有你输入正确的6位密码,才能看到我~~~~"
浙公网安备 33010602011771号