4.3.1 判断语句
1) if语句的格式:
if 条件 then 命令 fi
if 条件 then 命令 else 命令 fi if 条件 then 命令 elif 条件 then 命令 else 命令 fiif判断语句示例:
a例:判断当前用户是否为root,如果是,则执行/home/test 目录压缩
#!/bin/bash if [ "$(id -u)" -eq "0" ];then tar czf /home/test.tar.gz /home/test fib例:要求用户输入密码,并判断输入是否正确
#!/bin/bash
read -p "please enter your passwd: " passwd if [ "$passwd" == "123456" ];then echo "passwd is ok!" else echo "passwd error! please input your passwd again " fic例:判断kpi评级,60~70是D级,70~80是C级,80~90是B级,大于90是A
#!/bin/bash export LANG="zh_CN.UTF-8" if [ $1 -ge 90 ];then echo "A绩效优秀" elif [ $1 -ge 80 ];then echo "B绩效良好" elif [ $1 -ge 70 ];then echo "C绩效一般" elif [ $1 -ge 60 ];then echo "D绩效合格" else echo "绩效差" fi2)case 判断语句格式:
格式1:
case $变量名 in 模式1) 命令 ;; 模式2) 命令 ;; *) esac格式2:
case $变量名 in 模式1|模式2) 命令 ;; 模式3|模式4) 命令 ;; *) esaccase判断语句示例:
d例:判断单个字符是数字还是字母
#/bin/bash export LANG="zh_CN.UTF-8" read -p "请输入: " pake case $pake in [a-z] | [A-Z]) echo "您输入的是字母" ;; [[:digit:]]) echo "您输入的是数字" ;; *) echo "无法识别特殊字符" esace例:每月指定日期备份删除日志
#/bin/bash DATE=$(date +%d) TIME=$(date +%Y+%m+%d) case $DATE in 1|11|21) tar -czf /home/log/${TIME}_log_tar.gz /tmp/log/&>/dev/null ;; 2|12|22) rm -rf /tmp/log/*.2020-*.log ;; *) echo "今天不删除也不备份" esac4.3.2 循环语句
1)for语句
语法格式:
for 变量 in 值(或者循环条件) do 命令 donefor语句示例:打印9*9的乘法口诀
#!/bin/bash for k in {1..9} do for ((p=1;p<=k;p++)) do printf "%-10s" $p*$k=$((p*k)) done echo done2)while语句
语法格式:
while 条件 do 命令 done while read -r line do 命令 done < filewhile语法示例:批量添加10个用户
#!/bin/bash u=1 while [ $u -le 10 ] do useradd user${ $u } u=$((u+1)) done3)until语句
语法格式:
until 条件 do 命令 done示例:批量删除用户
#!/bin/bash u=6 until [ $u -eq 0 ] do userdel user${ $u } u=$((u-1)) done4)select语句
示例:用select生成购物询问
#!/bin/bash export LANG="zh_CN.UTF-8" echo "你想买哪一个颜色" select var in "红色" "蓝色" "绿色" "黄色" "小麦色" do break done echo "你选择的是: $var"5)控制语句
shift 将位置参数左移一位,也就是说执行shift后,$2变成$1,
countinue 中断当前循环,进入下一个循环 break 结束整个循环 exit 结束脚本的运行4.3.3 mysql备份
备份test数据库的脚本示例:
#!/bin/bash
export LANG="zh_CN.UTF-8" USER=root PASSWD="123456" DATABASE="test" HOSTNAME="192.168.1.137" BACKUP_DIR=/home/backup/ LOGFILE=/home/backup/mysql_backup.log DATE=`date '+%Y-%m-%d-%H-%M'` DUMPFILE=test_$DATE.sql ARCHIVE=test_$DATE.sql.tgz OPTIONS="-h$HOSTNAME -u$USER -p$PASSWD $DATABASE" if [ ! -d $BACKUP_DIR ] ; then mkdir -p "$BACKUP_DIR" fi echo " " >> $LOGFILE echo "———————————————–" >> $LOGFILE echo "备份开始时间:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE echo "———————————————– " >> $LOGFILE cd $BACKUP_DIR mysqldump $OPTIONS > $DUMPFILE if [[ $? == 0 ]]; then tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1 echo "[$ARCHIVE] 备份成功" >> $LOGFILE rm -f $DUMPFILE else echo "数据库备份失败....." >> $LOGFILE fi echo "数据库备份完成!!"4.3.4 机器互通
免密互通需要使用ssh和except,先安装except,yum install expect expect-devel tcl -y
脚本示例:
#!/bin/bash
echo "按enter键3次即可" ssh-keygen -t rsa #生成秘钥(按enter键3次即可生成) SERVERS="arango mysql es redis" #主机名 PASSWORD=123456 #主机登录密码 auto_ssh_copy_id(){ expect -c "set timeout -1; spawn ssh-copy-id $1; expect { *(yes/no)* {send -- yes\r;exp_continue;} *password:* {send -- $2\r;exp_continue;} eof {exit 0;} }"; } ssh_copy_id_to_all(){ for SERVER in $SERVERS #遍历要发送到各个主机的ip do auto_ssh_copy_id $SERVER $PASSWORD done } ssh_copy_id_to_all4.3.5 URL状态检测
检测脚本示例:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/loacl/sbin:~/bin export PATH . /etc/rc.d/init.d/functions check_count=0 url_list=(http://www.baidu.com https://blog.51cto.com http://www.qq.com http://192.168.1.5) function wait() { echo -n '3秒后开始执行检查UEL操作'; for ((i=1;i<4;i++)) do echo -n "$i...";sleep 1 done echo } function check_url() { wait for ((i=0;i<`echo ${#url_list[*]}`;i++)) do wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1 if [ $? -eq 0 ] then action "${url_list[$i]}" /bin/true else action "${url_list[$i]}" /bin/false fi done ((check_count++)) } main() { while true do check_url echo "----------check_count:$check_count----------" sleep 2 done } main4.3.6 跳板机
跳板脚本示例:
#!/bin/bash
trapper() { trap ':' INT EXIT TSTP TERM HUP } main() { while : do trapper clear cat<<EOF 1)web01-192.168.1.5 2)web02-192.168.1.6 3)web03-192.168.1.7 4)mysql-192.168.1.8 0)exit EOF read -p "please input the num: " num case "$num" in 1) echo 'login in 192.168.1.5 web01-nginx' ssh 192.168.1.5 ;; 2) echo 'login in 192.168.1.6 web02-nginx' ssh 192.168.1.6 ;; 3) echo 'login in 192.168.1.7 web03-nginx' ssh 192.168.1.7 ;; 4) echo 'login in 192.168.1.8 mysql-192' ssh 192.168.1.8 ;; 0) echo '退出' exit ;; *) echo "the num you have input is error" esac done } main4.3.7 菜单式发布应用
脚本示例:
#!/bin/bash
export LANG="zh_CN.UTF-8" menu(){ cat << END 请选择需要更新的服务 ======================= 1.app 2.admin 3.exit ======================= END } TIME=`date +%Y-%m-%d-%H-%M` tomcat_pid=`ps -ef |grep "tomcat"|grep "apache"|awk -F ' ' '{print $2}'` app(){ cd /data/service/ cp -a app /backup/app-$time cd app/project/ cp -a /package/app/app*.tar.gz . rm -rf lib tar zxf app*.tar.gz cp -a project/lib . /bin/bash init.sh stop /bin/bash init.sh start cd /backup/app-$time/project/ rm -rf logs echo "++++++++++++++++app更新成功++++++++++++++" } web(){ cd /data/www/ cp -a web /backup/web-$time cd web/ rm -rf ./* cp -a /package/web/web*.tar.gz . tar zxf web*.tar.gz rm -f web*.tar.gz echo "++++++++++++++++web更新成功++++++++++++++" } main(){ while true do menu read -p "请输入服务的序号以更新服务:" num case "$num" in 1) app ;; 2) web ;; 3) exit 1 ;; *) printf "输入错误 请重新输入对应数字" esac done } main以上的脚本示例仅仅是最简单的应用,shell脚本写法自由,格式限制少,功能多是简介明了,当需要复杂示例时候,可以查看像/etc/init.d/functions这类系统脚本学习一下。
精彩评论