三、shell 条件测试实战实例

shell 条件测试

一、脚本测试

bash -vx 以调试的方式执行一个脚本

bash -n 检测脚本是否有语法存在

test -d 判断是否为一个目录 ! test -d 判断是否不是一个目录

-f 判断是否为一个文件, !-f 判断是否不是一个文件

例1:查看某个变量在那些文件中使用,* 代表从所有文件进行过滤。

grep ‘变量名’ *

grep 例句:
[root@localhost shell]# grep 'mem_user' *
4.sh:mem_user=`free -m | grep ^Mem | awk '{print $3}'`
4.sh:mem_percent=$[ mem_user*10 / mem_total ]

例2:${#变量} 判断一个变量的长度是否为0

for line in `cat $1`
do
        if [ ${#line} -eq 0 ];then
                continue        
        fi

例3:扩充,命令判断

command 判断是否为一个命令
-v 显示命令绝对路径,或者详细信息

[root@localhost case]# command -v cat ;echo $?
/usr/bin/cat
[root@localhost case]# command -v ls ;echo $?
alias ls=‘ls --color=auto’

[root@localhost case]# command -v /usr/bin/aas;echo $?
1
[root@localhost case]# command -v /usr/bin/ls &> /dev/null ;echo $?
0

二、文件测试:

[ -d /目录 ] 判断是否为一个目录 [ ! -d /目录 ] 判断是否不是一个目录

[ -f /文件 ] 判断是否为一个普通文件 [ ! -f /文件 ] 判断是否不是一个文件

[ -e /dir|/file ] 判断目录/文件是否存在 [ ! -e /dir | /file ] 判断目录/文件是否不存在

[ -r file ] 判断文件是否有读取权限
[ -x file ] 判断文件是否有执行权限
[ -w file ] 判断文件是否有写入权限

[ -L /dir | /file ] 判断是否为链接文件
[ -b /dir | /file ] 判断是否为块设备文件
[ -c /file ] 判断是否为字符设备文件

三、数值测试:

[ -eq ] :等于
[ -ne ] : 不等于

[ -gt ]:大于
[ -lt ]:小于

[ -ge ]:大于等于
[ -le ]:小于等于

实例1:输入用户名并进行创建,测试该用户名是否为空

#!/bin/bash
read -p "请输入想要创建的用户:" user

none=''

[ $user == $none ]  && echo -e "\e[1;31m Try:请尝试输入任意用户 [0m\e"

while [ ! $user == '' ]
do

        id $user &>/dev/null
        if [ $? -eq 1 ];then
                useradd $user &> /dev/null
                if [ $? -eq 0 ];then
                        echo "$user is created successful ~" 
                fi
        else 
                echo "$user 已经存在"
        fi

done

实例2:如果磁盘根分区使用量超过90%就报警

磁盘根分区使用量:[root@localhost shell]# df -Th | grep “/$” | awk ‘{print $6}’ —13%

#!/bin/bash
disk=`df -hT | grep "/$" | awk '{print$6}' | awk -F"%" '{print$1}'`


if [ $disk -ge 13 ];then
        echo "`date +%F.%H:%M` 当前根分区使用量已到达13%" | mail -s "disl war ..." root

fi

实例3:如果内存使用率超过60%就报警

#!/bin/bash
mem_user=`free -m | grep ^Mem | awk '{print $3}'`
mem_total=`free -m | grep ^Mem | awk '{print $2}'`
mem_percent=$[ mem_user*10 / mem_total ]
war_file=/tmp/mem_war.txt
rm -rf $war_file

if [ $mem_percent -ge 1 ];then
        echo "`date +%F.%H:%M` memory的百分比为${mem_percent}%" > $war_file
fi

if [ -f $war_file ];then
        mail -s "mem is war..." root < $war_file
        rm -rf $war_file
fi                                                        

四、字符串测试

使用双引号,引上字符串来进行比较

" " = " " : 等于
" " == " ":同上,等于

" " != " " :不等于

[-z “value” ] 判断变量的值是否为空,为空返回0,不为空返回1。
[[ -z ]] 双对括号,变量不用加引号

[-n “value” ] 判断变量的值是否为空,为空返回1,不为空返回0。
[[ -n ]]双对中括号,变量不用加引号

五、正则匹配:

=~ :正则匹配,匹配左面的要求是否等于 =~右面的值

[0-9] 匹配0~9的其中一个数字

“+” ,前面的字符有1个到多个,至少有一个

^,$:开头,结尾

例: 批量创建用户,指定创建数量与用户前缀

#!/bin/bash
#useradd
#v1.0 by shm 2020-03-27

read -p "请输入想要创建的用户数量:" num

if [[ ! "$num" =~ ^[0-9]+$ ]];then
        echo "错误,请输入数字"
        exit
fi

read -p "请输入创建用户的部门/前缀:" prefix

if [[ -z $prefix ]];then
        echo "不能为空,请输入部门名称"
        exit
fi


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

六、流程控制

一、if语句

单分支结构

if 条件测试
then 命令序列
fi

双分支结构

if 条件测试
then 命令序列
else 命令序列
fi

多分支结构

if 条件测试1
then 命令序列

elif 条件测试2
then 命令序列

elif 条件测试3
then命令序列

fi

例1:让用户选择Y/N,来执行某项操作
#!/bin/bash
#yum install apache
#v1.0 by shm 2020-03-27

read -p "请确认是否继续您的操作[Y/N]:" input


if [[ $input =~ ^[0-9]+$  ]];then
        echo "您输入的内容有误,请输入[Y/N]"
        $input
elif [[ ! $input = [y,Y,n,N] ]];then
        echo "您输入的内容有误,请输入[Y/N]"
        $input
elif [[ $input = [y,Y] ]];then
        echo "执行成功"
        exit
elif [[ $input = [N,n] ]];then
        echo "执行失败"
        exit
fi
例2:根据不同的系统版本,是否存在yum文件,来配置本地yum源
#!/bin/bash
#yum config
#v1.0 by shm 2020-03-27

#获取当前主机版本号
os_version=`cat /etc/redhat-release |awk '{print$4}' | awk -F"." '{print$1"."$2}'`
yum_directory=/etc/yum.repos.d/


[ ! -d /etc/yum.repos.d/yum_bck ]
if [ $? -eq 0 ];then
         mkdir "$yum_directory"yum_bck &&
         mv "$yum_directory"*.repo  "$yum_directory"yum_bck
fi

#如果版本号是7版本,则创建一个.repo的文件
if [[ $os_version = "7.7" ]];then
         [ -f /etc/yum.repos.d/yum.repo ]
                if [ $? -eq 1 ];then
                        cat > "$yum_directory"yum.repo <<-EOF
                        [yum]
                        name=yum
                        enable=1
                        gpgcheck=0
                        baseurl=file:///media
                        EOF
                        echo "创建成功"
                else
                        echo "本地yum已存在"
                fi
fi

二、case语句

格式:

case 变量 in
模式1)
命令序列
;;
模式2)
命令序列
;;
模式3)
命令序列
;;
*)
无匹配后的命令序列
ease

例1:简单的模式匹配[Y/N]
#!/bin/bash
#Y/N
#2020-03-27

read -p "请输入[Y/N]" input

case $input in

[y,Y])
        echo "正在执行当中"
;;
[n,N])
        echo "程序已关闭"
;;
*)
        echo "请输入[Y/N],不要随便输入"
esac
例2:判断用户删除
#!/bin/bash
#delete
#v1.0 by shm 2020-03-27

read -p "please input the command you want to execute[create/delete][username]: " input username

case $input in

create)
        useradd $username
        echo "$username is created"
;;

delete)
        userdel $username
        echo "$username is deleted"
;;
*)
        echo "please input the command [create / delete]"
esac
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值