1.2 条件判断
1.2.1 按照文件类型进行判断
-b 文件 是否存在且为块状设备文件
-c 文件 是否存在且为字符设备文件
-d 文件 是否存在且为目录
-e 文件 是否存在
-f 文件 是否存在且为普通文件
-L 文件 是否存在且为符号链接文件
-p 文件 是否存在且为管道文件
-s 文件 是否存在且为非空
-S 文件 是否存在且为套接字文件
常用
-d 文件 是否存在且为目录
-e 文件 是否存在
-f 文件 是否存在且为普通文件
两种判断格式
test -e /root/install.log
[ -e /root/install.log ] && echo "yes" || echo "no"
echo $? 判断上一条命令是否正确 0为正确
1.2.2 按照文件权限进行判断
-r 文件 是否存在并且可读
-w 文件 是否存在并且可写
-x 文件 是否存在并且可运行
-u 文件 是否存在并且有SUID权限
-g 文件 是否存在并且有SGID权限
-k 文件 是否存在并且有SBit权限
1.2.3 两个文件之间进行比较
文件1 -nt 文件2 文件1的修改时间是否比文件2新
文件1 -ot 文件2 文件1的修改时间是否比文件2旧
文件1 -ef 文件2 判断Inode号是否一致,是否为同一个文件。可用于判断硬连接。
1.2.4 两个整数之间比较
整数1 -eq 整数2 是否相等
整数1 -ne 整数2 是否不等
整数1 -gt 整数2 是否大于
整数1 -lt 整数2 是否小于
整数1 -ge 整数2 是否大于等于
整数1 -le 整数2 是否小于等于
1.2.5 字符串判断
-z 字符串 是否为空
-n 字符串 是否非空
字串1 == 字串2 是否相等
字串1 != 字串2 是否不等
name=sc //等号两边不能有空格
[ -z "$name" ] && echo yes || echo no
no 结果
1.2.6 多重条件判断
判断1 -a 判断2 逻辑与
判断1 -o 判断2 逻辑或
!判断 逻辑非,原始判断取反
1.3 流程控制
if case for while
11.3.1单分支if条件语句
if [ 条件判断式 ];then
程序
fi
if [ 条件判断式 ]
then
程序
fi
所有的计算机技术,不是学会的,而是练会的。
例子
#!/bin/bash
#统计根分区使用率
rate=$(df -h | grep "/dev/sda2" | awk '{print $5}' | cut -d "%" -f 1)
#把根分区使用率作为变量值赋予变量rate
if [ $rate -ge 80 ]
then
echo "Warning! /dev/sda2 is full!!!"
fi
1.3.2 双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
例子
#!/bin/bash
#备份mysql数据库
ntpdate asia.pool.ntp.org &>/dev/null
#同步系统时间 输出内容丢弃
date=$(date +%y%m%d)
#时间戳
size=$(du -sh /var/lib/mysql)
#统计mysql数据库的大小
if [ -d /tmp/dbbak ]
then
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size : $size" >> /tmp/dbbak/dbiinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt
&>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
else
mkdir /tmp/dbbak
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size : $size" >> /tmp/dbbak/dbiinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt
&>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
fi
启动Apache
service httpd start
查询Apache是否启动
ps aux | grep httpd
判断端口
netstat -tlun
安装nmap工具
yum -y install nmap
例子
#!/bin/bash
#判断Apache是否启动
port=$(nmap -sT 192.168.143.132 | grep tcp | grep http | awk '{print $2}')
#使用nmap命令扫描服务器,并截取Apache服务的状态,赋予变量prot
if [ "$port" == "open"]
then
echo "$(date) httpd is OK!" >> /tmp/autostart-acc.log
else
/etc/rc.d/init.d/httpd start &>/dev/null
echo "$(date) restart httpd!!" >> /tmp/autostart-err.log
fi
1.3.3 多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断2成立时,执行程序2
...
else
当所有条件都不成立时,最后执行此程序
fi
例子
#!bin/bash
#判断用户输入的是什么文件
read -p "Please input a filename: " file
#接收键盘的输入,并赋予变量file
if [ -z "$file" ]
#判断file变量是否为空
then
echo "Error, please input a filename."
exit 1
elif [ ! -e "$file" ]
#判断file的值是否存在
then
echo "Your input is not a file!"
exit 2
elif [ -f "$file" ]
#判断file的值是否为普通文件
then
echo "$file is a regulare file!"
elif [ -d "$file"]
#判断file的值是否为目录文件
then
echo "$file is a directory!"
else
echo "$file is an other file!"
fi
1.3.4 case语句
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
... ...
*)
如果哦变量值都不是以上的值,此程序
;;
esac
1.3.5 for循环
语法一
for 变量 in 值1 值2 值3 ...
do
程序
done
例子
#!/bin/bash
#打印时间
for time in morning noon afternoon evening
do
echo "This time is $time!"
done
#!/bin/bash
#批量解压缩脚本
cd /lamp
ls *.tar.gz >ls.log
for i in $(cat ls.log)
do
tar -zxf $i &>/dev/null
done
rm -rf /lamp/ls.log
语法二
for ((初始值;循环控制条件;变量变化))
do
程序
done
例子
#!/bin/bash
#从1加到100
s=0
for((i=1; i<=100; i=i+1))
do
s=$(($s+$i))
done
echo "The sum of 1+2+...+100 is : $s"
#!/bin/bash
#批量添加指定数量的用户
read -p "input user name: " -t 30 name
read -p "input the number of user: " -t 30 num
read -p "input the password of user: " -t 30 pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
then
y=$(echo $num | sed 's/[0-9]//g')
if [ -z "$y" ]
then
for((i=1; i<=$num; i=i+1))
do
/usr/sbin/useradd $name$i &>/dev/null
echo $pass |/usr/bin/passwd--stdin $name$i &>/dev/null
done
fi
fi
1.3.6 while循环
不定循环,也称作条件循环。
只要条件判断式成立,循环就会一直继续。
和for的固定循环不太一样。
while [ 条件判断式 ]
do
程序
done
例子
#!/bin/bash
#从1加到100
i=1
s=0
while [ $i -le 100 ]
do
s=$(($s+$i))
i=$(($i+1))
done
echo "The sum is: $s"
until循环
和while循环相反,只要条件判断式不成立则进行循环
until [ 条件判断式 ]
do
程序
done
例子
#!/bin/bash
#从1加到100
i=1
s=0
util [ $i -gt 100 ]
do
s=$(($s+$i))
i=$(($i+1))
done
echo "The sum is: $s"
脚本语言:不适用于数值计算,主要用于辅助系统运维工作
好处:无需编译,所见即所得
坏处:运行速度慢