For循环##通常For循环用来执行一些重复不变步骤
for i in `ls /tmp` ##为ls /tmp设置变量为i
do ##所以执行do与Done内的操作,do对应需要done结尾
rm -rf $i ##删除ls /tmp查询到的内容
done
##参考
#!/bin/sh
for i in `seq 10`
do
echo $i
done
##分库备份
#!/bin/bash
dbpass="dahaoshanhe123"
dbsock=/u01/instance/3306/3306.sock
dblist="show databases;"|grep -Evi "Database|info|per|test|mysql"
dbopt="-B -F --single-transaction --master-data=2 --set-gtid-purged=OFF --triggers --routines --events"
for dbname in `mysql -uroot -p${dbpass} -S ${dbsock} -e $dblist`
do
/usr/local/mysqlone/bin/mysqldump -p${dbpass} -S ${dbsock} ${dbopt} $dbname |gzip > /u01/instance/3306/backup/${dbname}_$(date +%F)_$(date +%T).sql.gz
done
IF 判断语句
常用条件判断:
===判断文件是否存在
-f 判断某普通文件是否存在
-d 判断某目录是否存在
===判断文件权限
-r 判断文件是否为可读的属性
-w 判断文件是否为可以写入的属性
-x 判断文件是否为可执行的属性
===值比较
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
===逻辑的(and)与(or)
&& 逻辑的 AND 的意思, -a 也是这个意思
|| 逻辑的 OR 的意思, -o 也是这个意思格式一:
#!/bin/bash
echo '##打印一个菜单,以单引号开头结尾
===============================
1+1=?
===============================
'
read -p '请输入你的答案': nub##read -p 添加注释,nub代表用户输入的内容
if [ $nub -ne 2 ];then##对用户输入的值进行判断,如果不为2,then代表则执行下面操作
echo "这都能算错,洗洗睡吧"##如果输入值不等2 反馈信息-->"这都能算错,洗洗睡吧"
else ##否则
echo "小伙子很机智嘛" ##反馈-->"小伙子很机智嘛"
fi
格式二:
#!/bin/bash
echo '
===============================
1+1=?
===============================
'
read -p '请输入你的答案': nub
if [ $nub -ne 2 ];then
echo "这都能算错,洗洗睡吧"
elif [ $nub -eq 2 ];then
echo "小伙子很机智嘛"
fi
##牢记常见的条件判断比如-eq,-ne,以及if判断的语法格式,[]内判断写法,前后需要有空格
While循环格式:
while 18 > ##循环判断,孩子是否满18周岁
do
不可以去网吧##判断不满足条件,不可以去网吧,脚本结束
done
案例一:
#!/bin/bash
##连通性观察记录小脚本
##得出的的结果应该是18秒每次的间隔,添加监控IP只需要修改PIP的变量值即可
##运行时只需要sh shell_name &
##结束时只需要获取PID号码进行kill即可
PPATH=/root/IP监控/ #设置一个存放连通性记录文件的位置
PIP="192.168.56.22" #添加一个要测试的IP
echo $$ > /root/IP监控/ping.pid #打印该进程id到指定文件
[ ! -d $PPATH ] && mkdir -p $PPATH #判断该路径是否存在,如果不存在则创建该路径
while true #使用while无条件循环,若true永远执行该脚本除非手动停止,当然这个根据场景
do
/bin/ping $PIP -c 4 >/dev/null 2>&1 #在这里ping 4个失败的包将花去13秒
if [ $? -ne 0 ];then #判断上一步ping执行是否成功,判断若不成功则执行下一步
/bin/date >> $PPATH${PIP}.txt #打印ping不成功当前时间
fi
sleep 5 #这里睡眠5秒,继续返回进行下一轮循环
done
## while true #无限循环,除非手动停止
## while [-f /tmp/11] ##如果/tmp下存在11文件则循环do-done的操作,当11不存在时脚本结束
Case语句案例一:
#!/bin/sh
echo '
===============================
1. install http
2. install mysql
===============================
'
read -p '请输入需要安装的程序编号': nub
case "$nub" in
1)##若用户输入的nub的变量值为1,则执行该步骤
yum install httpd -y##执行的操作
;; ##固定格式,最后一个选项esac前不需要添加该符号
2)##若用户输入的nub的变量值为2,则执行该步骤
yum install -y iftop
;;
*)##若输入的内容不上以上的选项
echo "Please input [1/2]"
esac##case开头,case结尾
案例二:
case "$1" in
1)##若用户输入$1的变量值为1,则执行该步骤
yum install httpd -y##执行的操作
;; ##固定格式,最后一个选项esac前不需要添加该符号
2)##若用户输入的nub的变量值为2,则执行该步骤
yum install -y iftop
;;
*)##若输入的内容不上以上的选项
echo "Please input [1/2]"
esac##case开头,case结尾
Shell函数#!/bin/bash
. /etc/init.d/functions##加载函数
function start(){##定义一个start的启动函数,{}内为执行函数进行的动作操作
service httpd start > /dev/null 2>&1
if [ $? = 0 ];then
action "启动中..." /bin/true ##若启动无报错,则显示[ OK ]
else
action "启动中..." /bin/false ##若启动无报错,则显示[FAILED]
fi
}
function stop(){
service httpd stop > /dev/null 2>&1
if [ $? = 0 ];then
action "停止中..." /bin/true
else
action "停止中..." /bin/false
fi
}
function main(){
if [ $1 = "start" ];then
start
elif [ $1 = "stop" ];then
stop
fi
}
main $*##这里的$*就是把命令行接受的参数作为函数参数传给函数内部,是一种常用的手法
Expect交互自动化
当安装某个服务时,程序会交互的方式要求用户配置程序,比如在配置Redis、MySQL、OSSEC时[root@localhost ~]# mysql_secure_installation
Set root password? [Y/n] Y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
使用Expect后这些Y将由程序代替人工输入,对于某些没有RPM包的程序,比如OSSEC实现自动化部署成为一个可能
关于Expect更多资料可以查看本博客expect自动化交互脚本(1-3)