day64 条件判断的学习

day64 shell关于if的学习

条件判断的语法

# 首先看看优质的脚本是怎么写的。如何的模仿
# 找出系统中自带的shell的脚本
# find / -name "*.sh"
#看看别人是如何定义变量的,参数的使用,使用read的命令



学前的预览

条件的判断

  1. 我们目前写的shell的脚本都是自上而下的一次的读取命令,且执行
  2. 但是要控制程序执行的顺序,修改这个顺序,就得对脚本进行逻辑控制。
  3. 必须对脚本进行条件的判断

注意

语法中,括号,条件测试的符号左右的两边都有空格,千万别漏掉了。

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

bash /etc/init.d/functions

打开一个子bash,在该子bash的环境中加载该函数所有的变量,
子bash的环境,不会给父bash用。
  1. 看懂bash的环境概念
  2. 看懂这个脚本是如何的使用的/

条件测试整体概览

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位密码,才能看到我~~~~"
posted @ 2025-05-06 13:11  国家一级冲浪yzk  阅读(21)  评论(0)    收藏  举报