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时
[[email protected] ~]# 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)
原文地址:http://blog.51cto.com/swiki/2073456
时间: 2024-10-12 14:06:56