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