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)