(3.1)Linux Shell脚本的自动化编程之条件测试基础

1.shell条件测试

  • shell条件测试一共就三种:文件测试,数值比较,字符串比较
  • test -d /home 和[ -d /home]是一样的,注意命令和选项之间要加空格,[ 是个命令
  • 条件测试的用法如下:
格式1:test 条件表达式
格式2(推荐使用):[ 条件表达式 ],单个当括号不支持正则
格式3[[ 条件表达式 ]]
test的具体用法:man test


(1)文件测试eg
#!/usr/bin/bash
back_dir=/var
if ! test -d $back_dir;then ## 如果不是一个目录
	mkdir -p $back_dir
fi

执行:bash -vx test.sh

----------------------------------------------------------------------------------

#!/usr/bin/bash
back_dir=/var
if [! -d $back_dir ];then ## 如果不是一个目录
	mkdir -p $back_dir
fi

----------------------------------------------------------------------------------2)数值比较eg
#!/usr/bin/bash
if [ $UID -ne 0 ];then
	echo "no 权限!"
	exit
fi

yum -y install httpd

----------------------------------------------------------------------------------3)字符串比较
#!/usr/bin/bash
if [ $USER != "root" ];then
	echo "no 权限!"
	exit
fi

yum -y install httpd


2.文件测试

  • 具体用法
[-e dir|file]
[-d dir]
[-f file] 是否存在,而且是文件?
[-r file]	当前用户对该文件是否有读权限(除了root用户)
[-x file]
[-w file]
[-L file] 是链接文件吗?
[-b file] 是设备文件?
[-c file] 是字符设备吗?

eg:
[ ! -d/cc] && mkdir /ccc # 目录不存在就创建
[-d /ccc] || mkdir /ccc #目录存在就不创建
grep 'cat $1' *   # *代表从所有文件过滤
  • eg:
test -d /home
echo $?
0

test -d /home1111
echo $?
1

3.数值比较

  • 具体用法
[ 整数1 操作符 整数2 ]

[1 -gt 10 ] 大于
[1 -lt 10 ] 小于
[1 -eq 10 ] 等于
[1 -ne 10 ] 不等于
[1 -ge 10 ] 大于等于
[1 -le 10 ] 小于等于

  • C语言风格的比较如下
((1<2));echo $?
((1==2));echo $?
((1>2));echo $?
((1>=2));echo $?
((1<=2));echo $?
((1!=2));echo $?
((`id -u` >0));echo $? #变量执行的结果大于0吗?
(($UID==0));echo $?
  • eg
#!/usr/bin/bash
read -p "Please input a name :" user
# 利用id判断用户是否存在
#id $user &>/dev/null
# if [ $? -eg 0 ]
if id $user &>/dev/null;then #if后面可以跟语句,它只需要判断语句的执行是否为正确
	echo "user $user exits"
else
	useradd $user
	if [$? -eq 0 ];then
		echo "user $user is created"
	fi
fi
  • eg:获取磁盘使用的值
#!/usr/bin/bash
#NF-1指的是:倒数第二列
# awk -F "%"指的是:以百分号进行分割
# 最外面加个反括号``表示取的是值,如果不加,取的就是字符串
disk_use=`df -Th|grep '/$'|awk '{print ${(NF-1)}'|awk -F "%" '{print $1}'`##磁盘利用率
maile=alice

## 查看date的使用   date --help
# %F是年月日
if [ $disk_use -ge 90 ];then
	echo "`data +%F-%H` disk: ${disk_use}%"|mail -s "disk war..." $mail_user        
	##maile -s:后面跟着邮件主题,接着是接收用户
fi

(1)调试执行:bash -vx disk.sh
(2)每隔5分钟执行一下脚本(计划任务):crontab -e,然后填写:
*/5 * * * *    /bin/bash shell的绝对路径

(3)bash -n XXX.sh  检查shell脚本语法
  • eg
#一开始就要删除该文件

#!/usr/bin/bash
mem_used=`free -m|grep `^Mem:`|awk '{print $3}'`
mem_total=`free -m|grep '^Mem:'|awk '{print $2}'`
mem_percent=$((mem_used*100/mem_total))
war_file=/tmp/mem_war.txt
rm -rf $war_file

if [ $mem_percent -ge 80 ];then
	echo "`date +%F-%H` memory:${mem_percent}%" > $war_file
fi

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


4.字符串比较

  • 具体用法:要使用双引号将变量和字符串引起来
["$USER"=="root"];echo $?
0

BBB=""
echo ${#BBB}    #表示BBB字符串的长度
0

[-z "$BBB"]  字符串长度是0
echo $?

[-n "$BBB"]			字符串长度不是0
echo $?
1

##  -a 表示与    -o表示或    通过 man test可以查
[ 1 -lt 5 -a 5 -gt 10 ];echo $?
1
[ 1 -lt -o 5 -gt 10 ];echo $?
0


## [[]]必须用&&和||,[]单个括号用 -a ,-o
[[ 1 -lt 5 && 5 -gt 10 ]];echo $?
1
[[ 1 -lt || 5 -gt 10 ]];echo $?
0



  • eg:用户创建
#!/usr/bin/bash
################################
#useradd						#
#v1.0 by jiwang 2020/1/15		#
###############################

read -p "Please input number: " num
read -p "Please input prefix: " prefix
for i in `seq $num`  ## `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


bash -n use.sh  ##大致检查语法错误
==================================================================================

## ^[0-9]+$      +表示前面的字符有1到多个,^开头,$结尾
#!/usr/bin/bash
read -p "Please input number: " num
## num3=123yy
## [[ $num3 = ~ ^[0-9]+$ ]];echo $? 表示:num3变量是否匹配后面的正则模式
## 1


if [[ ! $num =~ ^[0-9]+$]];then  ###后面是正则比较,不要加“”,,~表示匹配。表示:如果不是数字,就echo,
	echo "no number"
	exit
fi
read -p "Please input prefix: " prefix
if [-z "$prefix"];then    ##字符串长度
	echo "error prefix"
	exit
fi


for i in `seq $num`  ## `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

发布了510 篇原创文章 · 获赞 134 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/103899210