如上图所示,当执行脚本出现在我们电脑屏幕上的信息对于我们来说,并无用处的时候,为了节省系统资源,保持系统性能,可以使用重定向符号将出现的内容交给/dev/null即系统中的黑洞文件中。
如上图所示,这个内容的脚本在我们第一次执行的时候肯定没有问题但是当第二次执行的时候,肯定就会报错了。
为了让脚本的执行更加符合人工作的逻辑。所以要加上条件判断。
条件判断
一.条件判断
支持的语法结构
if 语句
case语句
二.if条件判断
语法:
if 条件;then
执行的操作
执行的操作
fi
执行逻辑是如果条件成立,执行if语句中的内容,如果条件不成立就不执行if语句中的内容。
条件的写法:
1.shell命令,判断命令的执行状态码
如果命令的执行状态码为0表示条件为真,命令执行成功。
如果命令的执行状态为非0表示条件为假,命令执行失败。
2.[ 表示式 ]
注意这种条件写法的格式,方括号的左右两边都要有一个空格。
如果命令的执行状态码为0表示条件为真,命令执行成功。
如果命令的执行状态为非0表示条件为假,命令执行失败。
常用的表达式:
1.数字表示式
2.字符串表达式
如何在shell脚本中判断两个字符串是否相等。
[ 字符串1 == 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ] //判读字符串是否为空【如果用户什么都不往字符串中存储,则这个字符串为空,如果用户在这个字符串中敲空格,则这个字符串不为空。】
如果字符串中有空格,那么这个一个字符串就会被划分为多个参数。
如上图所示,如果字符串中有空格,就代表,会将一个字符串划分为多个参数。
如上图所示,当我们输入的字符串中有空格的时候,可以用双引号把字符串引起来。
这样操作系统就不会把一个字符串数据,划分为多个参数了。
3.文件目录表达式
用来判断文件目录是否存在,
表达式的写法:
双目表达式
操作符左右两边都有一个参数
单目表达式
所有的文件目录表达式都是单目表达式
注意:所有单目表达式都可以在条件的前面加上一个!表示取反
[ ! -e 文件或目录名称 ] 当文件目录不存在的时候,条件为真。
案例1:拷贝文件(表达式写法案例)
如上图所示,就是在shell脚本中首先可以先使用read将用户输出的文件路径,存储到变量
file_name,随后使用文件目录表达式判断这个文件是否存在,当这个文件存在的时候继续判断这个目录是否存在,当这个文件不存在的时候,直接使用echo语句进行输出,
当这个文件存在的时候,将目录名称,存储到变量dir_name中,随后使用文件目录表达式判断这个目录是否存在,然后使用cp命令将已经存在的文件中的内容都复制到目录中,随后使用echo语句进行输出。
当这个目录不存在的时候,可以使用mkdir -p来创建这个目录,随后执行cp命令,最后使用echo语句进行打印输出。
如上图所示,是执行脚本的情况。
如上图所示,这个操作是提示用户输入一个数字,这个数字会被保存到number的变量中,
当这个数字比10大的时候,条件为真,具体表现为$?=0
这时去执行if语句中的内容。
如上图所示,当用户输入的值使得条件判断为真的时候,输出A,
当用户输入的值使得条件判断为假的时候,不输出内容。
案例1:创建用户,判断用户是否存在,不存在则创建用户
如何判断一个用户在机器中是否存在?
如上图所示,可以使用id 用户名这样的操作来查看这个用户是否存在。当$?的值是0的时候,证明这个用户存在,当$?的值是非零的时候,证明这个用户不存在。
如上图所示,还可以在机器上使用grep去过滤/etc/passwd中是否有对应的用户名信息,
当$?是0的时候,证明这个命令执行成功,
当$?是非0的时候,证明这个命令执行不成功,则这个用户不存在。
如上图所示,可以使用grep过滤/etc/passwd中是否有用户名为tome的用户,
可以在需要过滤的字符串前面加上^破字符,这个破字符的含义是过滤字符前面不允许有任何字符。
如上图所示,这里首先定义命令解释器,即#!/bin/bash
然后使用read去读取用户输入的数据,将这个数据存储到变量username中。
这里的-p选项可以让用户在变量前面加上一些文件解释,用来展示给用户,提示用户输入什么样的数据,
随后调用变量的值,使用id 变量值,
查看这个用户是否存在,如果存在则中括号中的条件等于0,条件为假,
创建用户的操作就不执行,
如果中括号中的条件不等于0,条件为真,
创建用户的操作就执行。
这里预先设置了,如果条件为真,则新创建用户的密码是redhat,通过--stdin参数,存入/etc/passwd文件中。
如上图所示,就是执行脚本,创建新用户,并在编写脚本的时候,就设置好用户默认密码的操作。
可以使用id 用户名来查看当前用户是否创建成功。
如上图所示,英文感叹号表示对条件的结果进行去取反。
当这个用户名不存在的时候,条件为真,执行if语句中的操作。
if条件判断--单分支if
语法:
if条件;then
执行的操作
执行的操作
else
执行的操作
执行的操作
fi
如上图所示,这个操作是提示用户输入一个数字,这个数字会被保存到number的变量中,
当这个数字比10大的时候,条件为真,具体表现为$?=0
这时去执行if语句中的内容。打印出A。
反之执行if语句中的内容,打印出B。
案例1:改写创建用户的脚本
如上图所示,就是利用if单分支语句来判断用户是否存在,如果用户不存在则去创建用户。
如上图所示,就是脚本的执行过程。
案例2:判断用户的uid,gid,如果相同,显示Good user,否则显示Bad user
如上图所示,利用grep+破字符+用户名,加上awk工具来获取这个用户的uid和gid信息.ji
如上图所示,可以使用如上所示的方法去获取用户的uid和gid信息。即id -u用户名来获取用户的uid,id -g用户名来获取用户的gid
如上图所示,就是获取用户uid和gid并把相关信息保存进变量的方法,
当用户的uid与用户的gid不一致的时候,就会执行不同if分支,echo出现不同的信息。
案例3:判断文件中是否存在空行,有则显示空行的行数,否则显示没有空行
如上图所示,可以用"^$"的方式来表示空行,即"破字符+$",
如上图所示,就是显示文件是否有空行的脚本,将用户输入的文件目录路径保存在变量file_name中,随后将文件中的空行数,储存在变量line_number中,随后进行打印输出的操作,
案例4:检测磁盘使用率
如上图所示,就是一个检测磁盘使用率的脚本。
首先让用户输入要检测的磁盘路径,随后根据磁盘使用率进行相应的通知信息。
如上图所示,首先指定命令解释器。
随后在给定的命令中,df -hT | grep "^/" 部分用于列出所有根文件系统的磁盘使用情况(以易于理解的单位)。接下来的 awk '{print $7}' 从结果中提取出每个文件系统使用的百分比。
而这里的第二个echo语句的作用是输出一个空行,即一个换行符。它会在上述命令的结果之后打印出来。这通常用来使输出看起来更整洁或更容易阅读。如果没有这个 echo,则输出可能与下一段文本紧密相连,不易区分。
随后用户根据屏幕上打印出的各个磁盘的使用情况,将想要获取的磁盘状态的磁盘名称,存储进disk_name这个变量中,
随后引用disk_name这个变量,将磁盘的使用率从df -hT中挑选出来,交给变量usage,充当变量值。
最后在if语句的判断条件中,将这个磁盘使用率与60做比较,当磁盘使用率大于60的时候,通知信息为警告,当磁盘使用率小于60的时候,通知信息为正常。
四.if条件判断——多if分支
适用于判断变量有多种不同的取值
语法:
如上图所示,是if语句的多分支写法。
多条件的写法:
and ,or
1. and 并且的意思
[ 条件1 -a 条件2 ]
[ 条件1 ] && [ 条件2 ]
2. or 或者
[ 条件1 -o 条件2 ]
[ 条件1 ] || [ 条件2 ]
案例1:判断成绩
如上图所示,这是根据if语句的多分支写法,编写的一个判断成绩的脚本文件。
根据用户输入的成绩数值,进行不同结果输出的if多分支判断。
五.if条件判断——嵌套if语句(用来做多层条件判断)
如上图所示,这是一个if语句的嵌套,用来做多层条件判断。
如上图所示,这是一个用来判断用户是否存在,并且当用户存在的时候,获取用户uid与gid,来判断是输出Good user还是输出Bad user,当用户不存在的时候就去输出用户不存在的字样。