一、条件测试操作
(1)test命令
- 测试特定的表达式是否成立,当条件成立,测试语句的返回值为0,否则为其他数值
(利用$?查看上一条命令是否执行成功)
格式1: test 条件表达式
格式2:[ 条件表达式 ] (至少有一个空格最好开头末尾都加一个空格)
(2)文件测试
格式: [ 操作符 文件或目录 ]
常用的测试操作符
-d :测试是否为目录 (Directory)
-e :测试目录或文件是否存在 (Exist)
-f :测试是否为文件 (File)
-r :测试当前用户是否有权限读取 (Read)
-w:测试当前用户是否有权限写入 (Weite)
-x :测试当前用户是否有权限执行 (eXcute)
(r w x 和chmod的给的权限是一样的)
[root@localhost ~]# [ -d /media/cdrom ] [root@localhost ~]# echo $? 0 `返回0表示条件成立` [root@localhost ~]# [ -d /media/cdrom/Server ] [root@localhost ~]# echo $? 1 `返回1表示条件不成立` [root@localhost ~]# [ -d /media/cdrom ] && echo "YES YES `条件成立时返回YES,&&逻辑与,“而且”的意思`
(3)整数值比较
格式:[ 整数1 操作符 整数2 ]
常用的测试操作符
- -eq: 等于 (Equal)
- -ne: 不等于 (Not Equal)
- -gt: 大于 (Greater Than)
- -lt :小于 (Lesser Than)
- le :小于或等于 (Lesser or Equal)
- -ge:大于或等于(Greater or Equal)
[root@localhost ~]# who | wc -l 7 ————用户数是否 > 5 [root@localhost ~]# [ $(who | wc -l) -gt 5 ] && echo "aaa" aaa `(是否大于5,大于的话输出aaa)` ————用户数是否 >= 10 [root@localhost ~]# [ $(who | wc -l) -ge 10 ] && echo "bbb" `(用户大于10,则输出bbb,用户不大于10,则什么都不输出)` [root@localhost ~]# aaa=$(free -m | grep -i "mem" | awk '{print $4}') `(可以一步一步执行命令去查看,$(free -m | grep -i "mem" | awk '{print $4}'),grep -i 不区分大小写)` ————空闲内存是否 < 1024MB [root@localhost ~]# [ $aaa -lt 1024 ] && echo "空闲内存为 ${aaa}MB" 空闲内存为 379MB `(空闲内存小于1024则输出空闲内存为aaa的变量值MB)`
(4)字符串比较
格式1:
[ 字符串1 = 字符串2 ] (当字符串1内容相同于
字符串2的时候条件成立 )
[ 字符串1 != 字符串2 ] (当字符串1内容不同于
字符串2的时候条件成立)
格式2:
[ -z 字符串1 ] (当字符串1内容为空
时条件成立)
常用的测试操作符
- =:字符串内容相同
- !=:字符串内容不同
(!表示相反的意思)
- -z:字符串内容为空
[root@localhost ~]# echo $LANG zh_CN.UTF-8 [root@localhost ~]# [ $LANG != "en.US" ] && echo "Not en.US" Not en.US `(内容是否是en.US如果不是就输出 Not en.US)` [root@localhost ~]# read -p “是否覆盖现有文件(yes/no)?" ACK 是否覆盖现有文件(yes/no)?yes `(交互式变量,ACK的变量值是yes)` [root@localhost ~]# [ $ACK = "yes" ] && echo "覆盖" 覆盖 `(ACK的变量值是否为yes ,是的话输出 覆盖)`
(5)逻辑测试
格式1: [ 表达式1 ] 操作符 [ 表达式2 ] …
格式2: 命令1 操作符 命令2 …
常用的测试操作符
-a 或 && :逻辑与,“而且”的意思
-o 或 || :逻辑或,“或者”的意思
! :逻辑否
(1)、查看当前用户
[root@localhost ~]# echo $USER Root `($USER是系统表量,显示当前用户)` [root@localhost ~]# [ $USER != "teacher" ] && echo "Not teacher" Not teacher `(当$USER不等于 teacher时 输出Not teacher)`
(2)、测试目录是否存在
————如何测试/opt/backup目录是否存在? [root@localhost ~]# [ -d /media/cdrom ] && echo "YES" || echo "NO” `(检查/media/cdrom是否为目录,是的话输出YES,不是的话输出NO,条件成立时||的前一个不成立是后一个)`
3、查看任务进程
————查询当前的活动进程数,并测试是否小于100? [root@localhost ~]# [ $(ps aux | wc -l) -lt 100 ] && echo "YES" || echo "NO" YES `(小于100的话则是YES,大于100的话则是NO,ps aux 查看静态进程,wc -l统计行数)`
(4)、测试是否安装软件包
————如何测试是否已安装sysstat软件包? [root@localhost ~]# rpm -q sysstatpackage 未安装软件包 sysstatpackage [root@localhost ~]# [ $? -eq 0 ] && echo "Installed." || echo "Not installed." Not installed. `($? 上条命令的结果,0为成立,除外都为不成立,这里判定的是未安装所以算不成立)` `(如果上条命令结果成立,则输出lnstalled,如果不成立则输出Not installed)`
(5)、利用条件测试编写脚本,测试服务是否安装
————编辑脚本rpm_install.sh ***用来判断软件是否安装,如果已安装输出“此软件已安装”,如果未安装则进行安装 [root@localhost ~]# vim rpm_install.sh #!/bin/bash ***查看rpm软件是否已安装 rpm -q $1 &> /dev/null ***已安装输出结果,未安装则进行安装 [ $? -eq 0 ] && echo "$1 软件已安装" || yum -y install $1 &> /dev/null `(/dev/null相当于一个回收站)` [root@aaa ~]# chmod +x rpm_install.sh ***(给可执行权限) [root@aaa ~]# ./rpm_install.sh httpd ***(验证脚本) [root@aaa ~]# rpm -q httpd ***(发现已经安装) httpd-2.4.6-93.e17.centos.x86_64
if语句的结构
一、单分支结构
if 条件测试操作;then 命令序列
fi
例如:
if 磁盘已占用空间>80%;then 报警
(;可以在当前行直接写命令序列,不加;的话需要空到下一行去写)
【if开头,fi结束,then写命令序列,如果不符合if的条件则什么不做】
单分支if语句
————判断挂载点目录,若不存在则自动创建 [root@localhost ~]# cat 1.sh #!/bin/bash A="/media/cdrom/" if [ ! -d $A ] then `(当目录不存在时执行mkdir -p $A,存在的话不会做任何操作)` mkdir -p $A fi [root@localhost ~]# chmod +x 1.sh [root@localhost ~]# ./1.sh
二、双分支结构
if 条件测试操作; then 命令序列1
else 命令序列2
fi
例如:
if 80端口是否在监听;then 网站服务已在运行
else 启动httpd服务
fi
【if开始,fi结束,if条件测试成立的话执行then的命令序列,否则执行else的命令序列】
双分支if语句
判断目标主机是否存活,显示检测结果 [root@localhost ~]# cat 2.sh #!/bin/bash ping -c 3 -i 0.2 -W 3 $1 &> /dev/null `(/dev/null是“黑洞”相当于一个回收站,放进去的数据都会自动删除)` if [ $? -eq 0 ] `(判断ping命令的检测结果,分别给出不同提示,利用$1位置变量)` then echo "主机 $1 可以进行通信." else echo "主机 $1 无法进行通信." fi [root@localhost ~]# ./2.sh 192.168.4.11 主机 192.168.4.11 可以进行通信. [root@localhost ~]# ./2.sh 192.168.4.13 主机 192.168.4.13 无法进行通信. `ping命令的-c、-i、-W 选项分别指定测试包个数、发送间隔、超时时间`
三、多分支结构
if 条件测试操作1;then 命令序列1
elif 条件测试操作2 ;then 命令序列2
else;命令序列3
fi
例如:
if 分数为85~100之间;then 判为优秀
elif 分数为70~84之间;then 判为合格
esle;判为不合格
fi
【if开始,fi结束,条件测试操作1成立时执行then1的命令序列,条件测试操作2成立时执行then2的命令序列,以此推类,elif理论是可以无限写的,但是如果判定结果与所有的条件测试操作都不符合,则执行else的命令序列】
多分支if语句
————判断分数范围,分出优秀、合格、不合格三档 [root@localhost ~]# cat 3.sh #!/bin/bash read -p "请输入您的分数(0-100):" A if [ $A -ge 85 ] && [ $A -le 100 ] ; then `(如果符合这个条件执行这个)` `(判断分数所在区间,给出不同的分档结果)` echo "$A 分!优秀" elif [ $A -ge 70 ] && [ $A -le 84 ] ; then `(如果符合这个条件执行这个)` echo "$A 分,合格" else `(否则执行这个)` echo "$A 分?不合格” fi [root@localhost ~]#chmod a+x 3.sh [root@localhost ~]# ./3.sh 请输入您的分数(0-100):89 89 分!优秀 [root@localhost ~]# ./3.sh 请输入您的分数(0-100):75 75 分,合格 [root@localhost ~]# ./3.sh 请输入您的分数(0-100):60 60 分?不合格