参考链接:https://blog.csdn.net/yyywyr/article/details/50285251 https://blog.csdn.net/Cantevenl/article/details/115263888
条件判断语法格式
格式1: test 条件表达式 格式2: [ 条件表达式 ] 格式3: [[ 条件表达式 ]] 支持正则 =~ 注意: [ ] 和 [[ ]] 两边必须有空格
条件判断相关参数
判断文件类型
判断参数 含义 -e 判断文件是否存在(任何类型文件) -f 判断文件是否存在并且是一个普通文件 -d 判断文件是否存在并且是一个目录 -L 判断文件是否存在并且是一个软连接文件 -b 判断文件是否存在并且是一个块设备文件 -S 判断文件是否存在并且是一个套接字文件 -c 判断文件是否存在并且是一个字符设备文件 -p 判断文件是否存在并且是一个命名管道文件 -s 判断文件是否存在并且是一个非空文件(有内容)
例
[ root@maomao shell]
! -d 如果不存在 则创建
back_dir= /usr/local/mysql_bcak
if [ ! -d $back_dir ] ; then
mkdir -p $back_dir
fi
echo "开始备份..."
[ root@maomao shell]
非空
[ root@maomao shell]
[ root@maomao shell]
空
test -e file 只要文件存在条件为真
[ -d /shell/dir1 ] 判断目录是否存在,存在条件为真
[ ! -d /shell/dir1 ] 判断目录是否存在,不存在条件为真
[ [ -f /shell/1.sh ] ] 判断文件是否存在,并且是一个普通的文件
判断文件权限
判断参数 含义 -r 当前用户对其是否可读 -w 当前用户对其是否可写 -x 当前用户对其是否可执行 -u 是否有suid,高级权限冒险位 -g 是否sgid,高级权限强制位 -k 是否有t位,高级权限粘滞位
判断文件新旧
这里的新旧指的是文件的修改时间
判断参数 含义 file1 -nt file2 比较file1是否比file2新 file1 -ot file2 比较file1是否比file2旧 file1 -ef file2 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode
例
[ root@maomao shell]
[ root@maomao shell]
[ root@maomao shell]
0
判断整数
判断参数 含义 -eq 相等 -ne 不等 -gt 大于 -lt 小于 -ge 大于等于 -le 小于等于
#!/bin/bash
disk_use= ` df -Th | grep '/$' | awk '{print $( NF-1) }' | awk -F"%" '{print $1 }' `
mail_user= root
if [ $disk_use -gt 90 ] ; then
echo "` date +%F-%H` disk:${disk_use} %" | mail -s "disk warning..." $mail_user
fi
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))
warning_file= /shell/mem_war.txt
rm -rf $warning_file
if (( $mem_percent> 60 )) ; then
echo "` date +%F-%H` memory:${mem_percent} %" > $warning_file
fi
if [ -f $warning_file ] ; then
mail -s "mem warning..." root < $warning_file
rm -rf $warning_file
fi
判断字符串
判断参数 含义 -z 判断是否为空字符串,字符串长度为0则成立 -n 判断是否为非空字符串,字符串长度不为0则成立 string1 = string2 判断字符串是否相等 string1 != string2 判断字符串是否不等
例
[ root@maomao shell]
0
[ root@maomao shell]
1
[ root@maomao shell]
0
[ root@maomao shell]
0
[ root@maomao shell]
0
[ root@maomao shell]
0
多重条件判断
判断符号 含义 举例 -a 和 && 逻辑与 [ 1 -eq 1 -a 1 -ne 0 ] 或[ 1 -eq 1 ] && [ 1 -ne 0 ] -o 和 ||
逻辑或 [ 1 -eq 1 -o 1 -ne 1 ] 或[ 1 -eq 1 ] ||
[1 -ne 1]
特别说明: && 前面的表达式为真,才会执行后面的代码 || 前面的表达式为假,才会执行后面的代码 ; 只用于分割命令或表达式
逻辑运算符总结
符号;和&&和||都可以用来分割命令或者表达式 分号(;)完全不考虑前面的语句是否正确执行,都会执行;号后面的内容 &&符号,需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然 ||符号,需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后内容;反之亦然 如果&&和||一起出现,从左往右依次看,按照以上原则
数值比较
[ root@maomao ~]
C语言风格数值比较
注意:在(( )) 中,= 表示赋值;== 表示判断
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
字符串比较
注意:双引号引起来,看作一个整体;= 和 == 在 [ 字符串 ] 比较中都表示判断
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
test 表达式
[ 表达式 ]
[ [ 表达式 ] ]
思考:[ ] 和 [ [ ] ] 有什么区别?
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
-bash: [ : : unary operator expected
2
0
[ root@maomao ~]
[ root@maomao ~]
[ root@maomao ~]
批量创建用户脚本
#!/bin/bash
# 创建用户的脚本
# by stan Z
while true
do
read -p "Please input number:" num
if [[ ! "$num" =~ ^[0-9]+$ || "$num" =~ ^0+$ ]];then
echo "error number!"
else
break
fi
done
while true
do
read -p "Please input prefix:" prefix
if [ -z "$prefix" ];then
echo "error prefix"
else
break
fi
done
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