一、条件测试
1、test命令
要使shell脚本程序具备一定的"智能",面临的第一个问题就是如何区分不同的情况以确定执行何种操作。
例如,当磁盘使用率超过958l时,发送告警信息;当备份目录不存在时,能够自动创建:当源码编译程序时,若配置失败则不再继续安装等。
shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。
使用专门的测试工具———test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。
2、文件测试
语法格式:
格式1:test 条件表达式
格式2:[ 条件表达式 ]
#注意中括号和表达式中间需要隔一个空格或[ [条件表达式]]
文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否
可读、可写、可执行等。文件测试的常见操作选项如下,使用时将测试对象放在操作选项之后即
[ 操作符 文件或目录 ]
常用的测试操作符
| -d | 测试是否为目录(Directory) |
|---|---|
| -e | 测试目录或文件是否存在(Exist) |
| -f | 测试是否为文件(File) |
| -r | 测试当前用户是否有权限读取(Read) |
| -w | 测试当前用户是否有权限写入(Write) |
| -x | 测试当前用户是否有权限执行(eXcute) |
例:判断文件类型是否正确
[root@node home]# [ -f /home/xxx ] && echo "他是一个目录不是文件"
[root@node home]# echo $?
[root@node home]# [ ! -e /home/chailin ] && mkdir /home/chailin
[root@node home]# ls

例:
成功打开目录输出?

vim demo7.sh
#1.定义变量
mount_dir="/data"
#2.判断有没有这个目录
if [ ! -d $mount_dir ];then
mkdir -p $mount_dir
fi


vim demo7.sh
read -p "请输入你的文件名: " file
if [ $file==*.sh ];then
echo "这是一个shell脚本"
fi
sh demo7.sh


3、整数值比较
[ 整数1 操作数 整数2 ]
常用的测试操作符
| -eq | 等于(Equal) |
|---|---|
| -ne | 不等于(Not Equal) |
| -lt | 小于(Leser Than) |
| -gt | 大于(Greater Than) |
| -le | 小于或等于(Lesser or Equal) |
| -ge | 大于或等于(Greater or Equal) |
[root@node ~]# vim demo6.sh
#!/bin/bash
if [ 8 -gt 5 ];then
echo "ok"
fi
[root@node ~]# sh demo6.sh


例:
判断用户数量
[root@node ~]# [ $(who|wc -l) -le 4 ] && echo "用户太少"
用户太少
[root@node ~]# [ $(who|wc -l) -le 1 ] && echo "用户太少"
[root@node ~]# echo $?
1
[root@node ~]# [ $(who|wc -l) -ge 1 ] && echo "用户太多"
用户太多
[root@node ~]# [ $(who|wc -l) -ge 4 ] && echo "用户太多"
[root@node ~]# echo $?
1

例:
查询机器内存
[root@node ~]# free -m
total used free shared buff/cache available
Mem: 3771 757 262 73 2751 2616
Swap: 3999 0 3999
[root@node ~]# free -m | grep "Mem:" | awk '{print $4}'
262
[root@node ~]# abc=$(free -m | grep "Mem:" | awk '{print $4}')
[root@node ~]# echo $abc
262
[root@node ~]# [ $abc -lt 1024 ] && echo "$abc"Mb
262Mb
[root@node ~]# free -m | grep "Mem: "
Mem: 3771 756 262 73 2751 2616
[root@node ~]# free -m | grep "Mem: " | awk '{print $6}'
2751
[root@node ~]# [ $abc -le 1024 ] && echo "内存资源不足,请尽快清理"
内存资源不足,请尽快清理

4、字符串比较
格式1 [ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2 [ -z 字符串 ]
常用的测试操作符
| = | 字符串内容相同 |
|---|---|
| != | 字符串内容不同,!号表示相反的意思 |
| -z | 字符串内容为空 |
[root@node ~]# echo $LANG
zh_CN.UTF-8
[root@node ~]# [ $LANG = zh_CN.UTF-8 ] && echo '当前系统字符集是中文UTF-8'
当前系统字符集是中文UTF-8
[root@node ~]# cp /etc/passwd ./
cp:是否覆盖"./passwd"?
[root@node ~]# read -p"是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes


5、逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:命令1 操作符 命令2
常用的测试操作符
| -a或&& | 逻辑与,而且的意思 |
|---|---|
| -o或▕▕ | 逻辑或,或者的意思 |
| ! | 逻辑否 |
且或例子:

二、if语句的结构
1、单分支结构
if 条件测试操作
then 命令序列
fi

例:查看mount_dir 是否是一个目录,如果不是就创建一个

例2:
判断用户输入的文件是否是脚本

2、双分支结构
if 条件测试操作
then
命令序列 1
else
命令序列 2
fi
例1:
判断网络连接开启状态否向正常

例2:
输入你需要创建的用户,如果有该用户,那么显示已经存在,若没有创建并赋予123456为密码。


3、多分支结构
if 条件测试操作
then
命令序列1
elif
条件测试操作2
then
命令序列2
else
命令序列3
fi
例:
判断文件类别需求

三、case语句的结构
case多分枝结构
case 变量值 in
模式一)
命令序列
;;
模式二)
命令序列
;;
……
*)
默认命令序列
esac
例:
根据学生成绩罚抄题目案例

总结
• 条件测试的语法
文件测试、整数值比较、字符串比较、逻辑测试
• if条件语句的语法
单分支、双分支、多分支
• case多分支语句的语法
版权声明:本文为weixin_44841019原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。