03.Shell条件测试

徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。
笔者Q:552408925、572891887
架构师群:471443208

Shell条件测试

格式1: test 条件表达式
格式2: [ 条件表达式 ]
格式3: [[ 条件表达式 ]]

1.文件测试

[ -e dir|file ] 存在则为真
[ -d dir ] 目录是否存在
[ -f file ] 文件是否存在
[ -r file ] 文件是否有读权限
[ -x file ] 文件是否有执行权限
[ -w file ] 文件是否有写权限

1.常见使用方式

[ ! -d /bbb ] && mkdir /test 
[ -d /bbb ] || mkdir /test

2.备份mysql,手动输入你需要备份的库名称

read -p "请输入需要备份的库名称: " dumpdb

mysqldump -uroot -pBgx123.com -B $dumpdb > /backup/$(date +%F)_db.sql 

3.备份mysql,无需手动输入需要备份的库名

#!/usr/bin/bash

User=root
Pass=Bgx123.com
Data=bgxdb
Back_dir=/backup
Date=$(date +%F)
Backup_Path=$Back_dir/$Date

test -d $Backup_Path || mkdir -p $Backup_Path
if [ $? -eq 0 ];then
    echo "=======备份开始======="
    mysqldump -u$User -p$Pass -B$Data >$Backup_Path/mysql_db.sql
    if [ $? -eq 0];then
    echo "=======备份结束======="
    fi
fi

2.数值比较

数值比较 [ 整数 1 操作符 整数 2 ]
[ 1 -gt 10 ] 大于
[ 1 -lt 10 ] 小于
[ 1 -eq 10 ] 等于
[ 1 -ne 10 ] 不等于
[ 1 -ge 10 ] 大于等于
[ 1 -le 10 ] 小于等于

1.查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件

//怎么看磁盘使用率,怎么获取对应的值
df -h|grep "/$"|awk '{print $5}'|awk -F '%' '{print $1}'

//怎么进行数值比对
if [ $Disk_Free -ge 30 ];then
        echo "Disk Is Use:${Disk_Free}%" > /tmp/disk_use.txt
fi

//脚本
[root@bgx]# cat disk_free.sh 
#!/usr/bin/bash

Disk_Free=$(df -h|grep "/$"|awk '{print $5}'|awk -F '%' '{print $1}')

if [ $Disk_Free -ge 30 ];then
        echo "Disk Is Use:${Disk_Free}%" > /tmp/disk_use.txt
fi

2.查看内存/当前使用状态,如果使用率超过80%则报警发邮件

[root@bgx]# cat mem.sh 
Mem_Total=$(free -m|grep "^M"|awk '{print $2}')
Mem_Use=$(free -m|grep "^M"|awk '{print $3}')
Mem_B=$((($Mem_Use*100)/$Mem_Total))

if [ $Mem_B -ge 30 ];then
    echo -e "Memory Is Err ${Mem_B}% " 
else
    echo  Memory Is OK ${Mem_B}%"
fi

3.打印当前系统版本,内核,虚拟平台,主机名,内网Ip,外网Ip

3.字符串比较

1.字符串比对

[root@bgx]# [ "$USER " = "root" ];echo $? 
0
[root@bgx]# BBB="" 
[root@bgx]# echo ${#BBB} 
0

#字符长度为 0
[root@bgx]# [ -z "$BBB" ] 
[root@bgx]# echo $?
0 

#字符长度不为 0
[root@bgx]# [ -n "$BBB" ] 
[root@bgx]# echo $?
1

#小结:变量为空 或未定义: 长度都为0

2.字符串比对,必须使用双引号

[root@bgx]# [ "$USER" = "root" ];echo $? 
0 
[root@bgx]# [ "$USER" = "bgx" ];echo $? 
1 
[root@bgx]# [ "$USER" != "alice" ];echo $? 
0

3.多整数比对条件

[root@bgx]# [ 1 -lt 2 -a 5 -gt 10 ];echo $?
1
[root@bgx]# [ 1 -lt 2 -o 5 -gt 10 ];echo $?
0

#正则比对会使用到[[]]
[root@bgx]# [[ 1 -lt 2 && 5 -gt 10 ]];echo $?
1
[root@bgx]# [[ 1 -lt 2 || 5 -gt 10 ]];echo $?
0

4.正则比对

# 单括号无法使用正则语法
[root@bgx]# [ "$USER" =~ ^r ];echo $?
bash: [: =~: binary operator expected 
2

# 双[]才可以使用正则匹配
[root@bgx]# [[ "$USER" =~ ^r ]];echo $? 
0

# 判断变量是不是数字
[root@bgx]# num=123
[root@bgx]# [[ "$num" =~ ^[0-9]+$ ]];echo $?
0
[root@bgx]# num=123a
[root@bgx]# [[ "$num" =~ ^[0-9]+$ ]];echo $?
1

5.判断用户输入的是否是数字

[root@bgx]# cat test02.sh 
#!/bin/bash

read -p "请输入一个数值: " num
if [[ ! "$num" =~ ^[0-9]+$ ]];then
    echo " 你输入的不是数字,程序退出!!!"
    exit
fi
echo "Number Is $num"

6.批量创建用户脚本, 仅个人使用

#!/usr/bin/bash
read -p "Please input number: " num
read -p "Please input prefix: " prefix

for i in `seq $num`;do
    user=$prefix$i
    useradd $user
    echo "123" |passwd --stdin $user &>/dev/null
    if [ $? -eq 0 ];then
        echo "$user is created."
    fi
done

7.批量创建用户脚本, 改进版

#!/usr/bin/bash
read -p "Please input number: " num
if [[ ! "$num" =~ ^[0-9]+$ ]];then
    echo "error number!" && exit 1
fi

read -p "Please input prefix: " prefix
if [ -z "$prefix" ];then
    echo "error prefix"
    exit
fi

for i in `seq $num`
do
    user=$prefix$i
    useradd $user
    echo "123" |passwd --stdin $user &>/dev/null
    if [ $? -eq 0 ];then
        echo "$user is created."
    fi
done

8.批量创建用户脚本, 完善版